Django配置多个数据库、算是一种负载均衡吧
以下内容是个人的随手记录,就是介绍了下简单的使用;
欢迎大家吐槽,接下来就是激情的时刻,准备好啤酒饮料矿泉水,开整!!!
项目使用环境:
- 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配置多个数据库、算是一种负载均衡吧相关推荐
- django 不用自带的mysql_21_django配置使用mysql数据库的两种方式
配置django项目使用mysql数据库的两种方式 1. 直接在settings.py 文件中添加数据库配置信息 # 配置数据库的第一种方式 DATABASES = { 'default': { 'E ...
- MySQL数据库集群实现负载均衡的安装配置详解
本文我们详细地介绍了MySQL 5.0数据库集群负载均衡的安装配置工作,希望能够对您有所帮助. 本文我们主要介绍了MySQL数据库集群实现负载均衡的安装配置工作,接下来我们就让我们一起来了解一下这部分 ...
- 2万字长文盘点五种负载均衡策略
来源:why公众号 荒腔走板 老规矩,在技术分享开始之前,先荒腔走板,聊点别的.给枯燥的技术文章注入一抹其它的色彩. 上面的图片,是我在骑车的过程中拍的.衣服随意的绑在驼包上,两侧各挂着一只鞋子,左边 ...
- 经过负载均衡图片加载不出来_吐血输出:2万字长文带你细细盘点五种负载均衡策略。...
Dubbo的五种负载均衡策略 2020 年 5 月 15 日,Dubbo 发布 2.7.7 release 版本.其中有这么一个 Features 新增一个负载均衡策略. 熟悉我的老读者肯定是知道的, ...
- 吐血输出:2万字长文带你细细盘点五种负载均衡策略。
Dubbo的五种负载均衡策略 2020 年 5 月 15 日,Dubbo 发布 2.7.7 release 版本.其中有这么一个 Features 新增一个负载均衡策略. 熟悉我的老读者肯定是知道的, ...
- 配置高可用的循环复用DNS负载均衡
配置高可用的循环复用DNS负载均衡 提供:ZStack社区 前言 如何利用云主机提供商的全球部署来最合理的分布你的应用?这个话题在技术圈充满争议,不过DNS(即,IP转发列表)应该算是一个好方案.特别 ...
- lvs的调度算法有几种_LVS:三种负载均衡方式比较
1.什么是LVS? 首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.调度器具有很 ...
- LVS:三种负载均衡方式比较+另三种负载均衡方式
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- LVS:三种负载均衡方式比较
1.什么是LVS? 首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.调度器具 ...
最新文章
- Git详解之九 Git内部原理
- flask-wtforms
- 广度优先遍历算法-03树的右侧问题
- OpenCV3学习(12.5) opencv实现粒子滤波目标跟踪
- cmake 检查文件更新_2020年6月:Visual Studio对Linux开发平台的更新
- weblogic 解决线程阻塞
- iPhone企业应用实例分析之二:程序处理流程
- 网络空间搜索引擎全方位评测
- 仿链家地图找房_仿链家地图找房的简单实现
- SOFTICE 初使用
- 【干货】在拉斯维加斯,程序员如何靠bandits算法干掉老虎机
- 轻松易懂的CSS学习权威指南来了
- FFmpeg:‘UINT64_C‘ was not declared in ths scope
- 恢复误删的 TiDB 集群
- java wap访问网页_在PC使用Chrome访问wap网页
- 传统企业建企业网站应当懂得借助外力
- 中投民生:外资狂卖122亿,贵州茅台被抛售10亿,究竟发生了什么事?
- 10.710.8 基于HyperOpt实现TPE优化基于Optuna实现多种优化
- Photozoom2020汉化免费下载图片放大软件使用教程
- 水个题---英尺换算
热门文章
- mysql host 为%,mysql清理host为%的用户Mysql命令大全(完整版)
- 《创新者的逆袭》——第十课,小米
- Redis系列-第四篇持久化与事务
- 3600插b450i开不了机_学生党便携主机,Ryzen 5 3600+技嘉B450i+Radeon RX5700测试篇
- 马士兵:从零到年薪百万,写给浮躁的程序员
- React——浅析useState原理
- vuejs项目前端纯js在线下载网页内容保存为自定义格式的word文件、另存为word文件
- VS2017使用.def文件生成动态库
- Flutter知识点总结
- MacOS修改终端hostname