以下内容是个人的随手记录,就是介绍了下简单的使用;

欢迎大家吐槽,接下来就是激情的时刻,准备好啤酒饮料矿泉水,开整!!!

项目使用环境:

- Python3.6.3

- Django==2.0.6

- Sqlite3

第一步:配置settings.py文件

# 这里是主配置我只是把我的配置贴出来(自己要对应上自己的项目)
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','authpermission','webshow','captcha','commons','accounts','django_celery_results','webshielddata'
]################################################
#                                              #
#       database Configuration                 #
#                                              #
################################################
DATABASES = {'default': {},"webshield_web_db": {'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(DBS_DIR, "webshield_web.db"),},"webshield_db": {'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(DBS_DIR, "webshield.db"),}
}
DATABASE_ROUTERS = ['commons.database_router.Webshieldauthrouter']DATABASE_APPS_MAPPING = {# Example# appname : database"admin": "webshield_web_db","auth": "webshield_web_db","contenttypes": "webshield_web_db","sessions": "webshield_web_db","accounts": "webshield_web_db","authpermission": "webshield_web_db","webshow": "webshield_web_db","webshielddata": "webshield_db",
}

"default": Django默认选择使用的数据库、这里设置为空

"webshield_web_db": 数据库一

"webshield_db": 数据库二

"DATABASE_ROUTERS": 数据库路由配置配置内容见database_router.py文件,配置的路径为database_router.py文件的路径

"DATABASE_APPS_MAPPING": 数据库与app做映射,每个app对应使用的数据库

appname: 在主配置文件中INSTALLED_APPS列表中的名

注意:为了使django自己的表也创建到你自己定义的数据库中,你可以指定 : admin, auth, contenttypes, sessions 到设定的数据库中,如果不指定则会自动创建到默认(default)的数据库中.

第二步:创建database_router.py文件(此文件名可以自己随意起)

我的路径是: commons/database_router.py,此路径DATABASE_ROUTERS会使用

from django.conf import settingsDATABASE_MAPPING = settings.DATABASE_APPS_MAPPINGclass Webshieldauthrouter(object):"""数据库路由、读写配置"""def db_for_read(self, model, **hints):"""设置从哪个表读取数据"""if model._meta.app_label in DATABASE_MAPPING:return DATABASE_MAPPING[model._meta.app_label]return Nonedef db_for_write(self, model, **hints):"""设置写入数据到哪个表"""if model._meta.app_label in DATABASE_MAPPING:return DATABASE_MAPPING[model._meta.app_label]return Nonedef allow_relation(self, obj1, obj2, **hints):"""表一(obj1)与表二(obj2)是否可以产生关联"""db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)if db_obj1 and db_obj2:if db_obj1 == db_obj2:return Trueelse:return Falsereturn Nonedef allow_migrate(self, db, app_label, model_name=None, **hints):"""确定migrate操作是否可以在别名为db的数据库上运行"""if db in DATABASE_MAPPING.values():return DATABASE_MAPPING.get(app_label) == dbelif app_label in DATABASE_MAPPING:return Falsereturn None

解释:

db_for_read():每个app从哪个数据库读取数据

db_for_write(): 每个app写数据写入那个数据库

allow_relation(): 允许同一数据库中每个app的表之间差生关系(Foreignkey, OneToOneField, ManyToManyField)

allow_migrate(): 确定migrate操作统一,要app与对应映射的数据库统一

第三步: django创建表例子

project_name(项目名)/appname1(app名)/models.py

from django.db import modelsclass Webshield_data(models.Model):"""硬件提供数据表"""access_id = models.IntegerField(verbose_name="访客id",null=True)def __unicode__(self):return self.idclass Meta:app_label = "webshielddata"  # 这里很重要,是settings.py中INSTALLED_APPS列表对应的数据db_table = "webshield_data"verbose_name = "硬件提供数据"verbose_name_plural = verbose_name

提示:此表数据会存入webshield_db数据库

project_name(项目名)/appname2(app名)/models.py

from django.db import modelsclass data1(models.Model):"""硬件提供数据表"""name = models.Charfield(verbose_name="名称",max_length=521,null=True)def __unicode__(self):return self.nameclass Meta:app_label = "accounts"  # 这里很重要,是settings.py中INSTALLED_APPS列表对应的数据db_table = "data1"verbose_name = "测试数据"verbose_name_plural = verbose_name

提示:此表数据会存入webshield_web_db数据库

第四步:生成数据表

python3 manage.py makemigrations# 创建表app对应的表到webshield_web_db数据库中
python3 manage.py migrate --database=webshield_web_db# 创建表app对应的表到webshield_db数据库中
python3 manage.py migrate --database=webshield_db# 创建表app对应的表到default数据库中(如果default配置存在)
python3 manage.py migrate

注意:与此相应的,dbshell,dumpdata,loaddata命令都有--database选项。

指定数据表导出:


python3 manage.py dumpdata app1.modelname --database=db1 > app1_fixture.json
python3 manage.py dumpdata app2.modelname --database=db2 > app2_fixture.json

第五步:使用CURD时注意事项

查询:

#### 查询(select)# 查询 'default' 数据库.
Author.objects.all()# 查询 'default' 数据库.
Author.objects.using('default').all()# 查询 'webshield_web_db' 数据库.
Author.objects.using('webshield_web_db').all()

第一种添加方式: 

#### 添加my_object.save(using='webshield_web_db')

第二种添加方式: 

#### 保存
p = Person(name='Fred')
p.save(using='first')  # (statement 1)
p.save(using='second') # (statement 2)

注意:第二种添加方式的代码会产生问题,当p在first数据库中第一次保存时,会默认生成一个主键,这样使用second数据库保存时,p已经有了主键,这个主键如果未被使用不会产生问题,但如果先前被使用了,就会覆盖原先的数据。

主键冲突问题解决办法:

解决方案一:

#### 解决办法一
p = Person(name='Fred')
p.save(using='first')
p.pk = None # Clear the primary key.
p.save(using='second') # Write a completely new object.

解决方案二:

#### 解决办法二
p = Person(name='Fred')
p.save(using='first')
p.save(using='second', force_insert=True)

删除:

u = User.objects.using('webshield_web_db').get(username='fred')
u.delete() # 从 `webshield_web_db` 库删除

将对象从B数据库移动到A数据库:

user_obj.save(using='A')
user_obj.delete(using='B')

总结:以上内容不仅仅是针对sqlite数据库、同时也适用mysql;

注意:以上内容是个人使用的随手记录, 就是介绍了下简单的使用

欢迎大家来吐槽,准备好瓜子饮料矿泉水,开整!!!

---------------------------------------------------------------------------------------

搞笑一则:能动手尽量别吵吵

Django配置多个数据库、算是一种负载均衡吧相关推荐

  1. django 不用自带的mysql_21_django配置使用mysql数据库的两种方式

    配置django项目使用mysql数据库的两种方式 1. 直接在settings.py 文件中添加数据库配置信息 # 配置数据库的第一种方式 DATABASES = { 'default': { 'E ...

  2. MySQL数据库集群实现负载均衡的安装配置详解

    本文我们详细地介绍了MySQL 5.0数据库集群负载均衡的安装配置工作,希望能够对您有所帮助. 本文我们主要介绍了MySQL数据库集群实现负载均衡的安装配置工作,接下来我们就让我们一起来了解一下这部分 ...

  3. 2万字长文盘点五种负载均衡策略

    来源:why公众号 荒腔走板 老规矩,在技术分享开始之前,先荒腔走板,聊点别的.给枯燥的技术文章注入一抹其它的色彩. 上面的图片,是我在骑车的过程中拍的.衣服随意的绑在驼包上,两侧各挂着一只鞋子,左边 ...

  4. 经过负载均衡图片加载不出来_吐血输出:2万字长文带你细细盘点五种负载均衡策略。...

    Dubbo的五种负载均衡策略 2020 年 5 月 15 日,Dubbo 发布 2.7.7 release 版本.其中有这么一个 Features 新增一个负载均衡策略. 熟悉我的老读者肯定是知道的, ...

  5. 吐血输出:2万字长文带你细细盘点五种负载均衡策略。

    Dubbo的五种负载均衡策略 2020 年 5 月 15 日,Dubbo 发布 2.7.7 release 版本.其中有这么一个 Features 新增一个负载均衡策略. 熟悉我的老读者肯定是知道的, ...

  6. 配置高可用的循环复用DNS负载均衡

    配置高可用的循环复用DNS负载均衡 提供:ZStack社区 前言 如何利用云主机提供商的全球部署来最合理的分布你的应用?这个话题在技术圈充满争议,不过DNS(即,IP转发列表)应该算是一个好方案.特别 ...

  7. lvs的调度算法有几种_LVS:三种负载均衡方式比较

    1.什么是LVS? 首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.调度器具有很 ...

  8. LVS:三种负载均衡方式比较+另三种负载均衡方式

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  9. LVS:三种负载均衡方式比较

    1.什么是LVS?   首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.调度器具 ...

最新文章

  1. Git详解之九 Git内部原理
  2. flask-wtforms
  3. 广度优先遍历算法-03树的右侧问题
  4. OpenCV3学习(12.5) opencv实现粒子滤波目标跟踪
  5. cmake 检查文件更新_2020年6月:Visual Studio对Linux开发平台的更新
  6. weblogic 解决线程阻塞
  7. iPhone企业应用实例分析之二:程序处理流程
  8. 网络空间搜索引擎全方位评测
  9. 仿链家地图找房_仿链家地图找房的简单实现
  10. SOFTICE 初使用
  11. 【干货】在拉斯维加斯,程序员如何靠bandits算法干掉老虎机
  12. 轻松易懂的CSS学习权威指南来了
  13. FFmpeg:‘UINT64_C‘ was not declared in ths scope
  14. 恢复误删的 TiDB 集群
  15. java wap访问网页_在PC使用Chrome访问wap网页
  16. 传统企业建企业网站应当懂得借助外力
  17. 中投民生:外资狂卖122亿,贵州茅台被抛售10亿,究竟发生了什么事?
  18. 10.710.8 基于HyperOpt实现TPE优化基于Optuna实现多种优化
  19. Photozoom2020汉化免费下载图片放大软件使用教程
  20. 水个题---英尺换算

热门文章

  1. mysql host 为%,mysql清理host为%的用户Mysql命令大全(完整版)
  2. 《创新者的逆袭》——第十课,小米
  3. Redis系列-第四篇持久化与事务
  4. 3600插b450i开不了机_学生党便携主机,Ryzen 5 3600+技嘉B450i+Radeon RX5700测试篇
  5. 马士兵:从零到年薪百万,写给浮躁的程序员
  6. React——浅析useState原理
  7. vuejs项目前端纯js在线下载网页内容保存为自定义格式的word文件、另存为word文件
  8. VS2017使用.def文件生成动态库
  9. Flutter知识点总结
  10. MacOS修改终端hostname