django 配置 多数据库
django多数据库
阅读spider platform时发现前端项目中使用了多数据库,那么django实现多数据库需要哪些配置呢,又如何使用呢?
定义及路由机制
定义
在settings里面的DATABASES是一个字典,用于定义需要的数据库,如下,一共定义了两个数据库。
DATABASES = {
'default': {
'NAME': 'app_data',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'postgres_user',
'PASSWORD': 's3krit'
},
'user1': {
'NAME': 'user1_data',
'ENGINE': 'django.db.backends.mysql',
'USER': 'mysql_user',
'PASSWORD': 'priv4te'
}
'user2': {
'NAME': 'user2_data',
'ENGINE': 'django.db.backends.mysql',
'USER': 'mysql_user',
'PASSWORD': 'priv4te'
}
}
那么什么时候调用default什么时候调用users数据库呢,这就需要下面的路由。
路由注册
class User1Router(object):
""" A router to control all database operations on models in the auth application. """
def db_for_read(self, model, **hints):
""" Attempts to read auth models go to auth_db. """
if model._meta.app_label == 'auth':
return 'user1'
return None
def db_for_write(self, model, **hints):
""" Attempts to write auth models go to auth_db. """
if model._meta.app_label == 'auth':
return 'user1'
return None
def allow_relation(self, obj1, obj2, **hints):
""" Allow relations if a model in the auth app is involved. """
if obj1._meta.app_label == 'auth' or \
obj2._meta.app_label == 'auth':
return True
return None
def allow_syncdb(self, db, model):
""" Make sure the auth app only appears in the 'auth_db' database. """
if db == 'auth_db':
return model._meta.app_label == 'auth'
elif model._meta.app_label == 'user1':
return False
return None
class User2Router(object):
""" A router to control all database operations on models in the auth application. """
def db_for_read(self, model, **hints):
""" Attempts to read auth models go to auth_db. """
if model._meta.app_label == 'auth2':
return 'user2'
return None
def db_for_write(self, model, **hints):
""" Attempts to write auth models go to auth_db. """
if model._meta.app_label == 'auth2':
return 'user2'
return None
def allow_relation(self, obj1, obj2, **hints):
""" Allow relations if a model in the auth app is involved. """
if obj1._meta.app_label == 'auth' or \
obj2._meta.app_label == 'auth':
return True
return None
def allow_syncdb(self, db, model):
""" Make sure the auth app only appears in the 'auth_db' database. """
if db == 'auth_db':
return model._meta.app_label == 'auth2'
elif model._meta.app_label == 'user2':
return False
return None
User1Router的路由逻辑是,如果model所属的app是auth的话,就使用user1数据库,否则就使用其他的;User2Router的逻辑类似。
如何注册路由
光定义路由程序无法调用到,还需要注册到django中,在settings中定义
DATABASE_ROUTERS = ['path.to.User1Router' , 'path.to.User2Router']
path.to:是User1Router的完整python包路径,所以,User1Router不一定要在settings中实现,可以在任何地方。
路由机制
那么django是如何选择其中一个路由的呢?
1. django按照注册的顺序轮询DATABASE_ROUTERS,所以首先验证User1Router是否返回了非空字符串,如果是,则使用User1Router;如果不是则接着验证后面的Router;
2. 同样验证User2Router,如果User2Router返回了非空字符串,则使用User2Router;如果不是则使用default数据库;
3. 所以可以看出,路由注册的顺序是会影响最后的结果的,注册在前面的路由会优先被使用;
自动路由和手动路由
上面定义的Router是自动路由,意思是django会自动轮询所注册的路由器,某个model会保存在哪个数据库,是django通过注册的Router自动获得的,在编码中你不需要指定;
手动路由,则是你可以在编码中指定某个model要保存到哪个数据库。
而且手动路由也有性能方面的优点,如果定义了很多个数据库,每次保存或者读取model都要把轮询一遍路由列表,显然效率有些低,如果程序逻辑清楚的知道当前的代码应该连接哪个数据库,显示指定的方式显然效率更高。
手动路由
查询
使用using函数,参数就是要查询的数据库
User.objects.using('user1').all()
保存或者更新
使用save的using参数,值就是要使用的数据库
>>> my_object.save(using='user1')
删除
使用delete的using参数
>>> user_obj.delete(using='user1')
分库技术
下面紧紧介绍分库的思路。
垂直分库
即一个app对应一个数据库,上面自动路由的例子就是一个垂直分库的例子,auth1使用user1数据库,auth2使用user2数据库。当然也可以使用手动路由。
水平分库
水平分库建议使用手动路由,因为每个model的分库机制可能都不一样,自动路由实现起来有些麻烦会造成性能不高,而手动路由,每个model根据自己的规则来获得不同的数据库。
django 配置 多数据库的更多相关文章
- DJango配置mysql数据库以及数据库迁移
DJango配置mysql数据库以及数据库迁移 一.Django 配置MySQL数据库 在settings.py中配置 import pymysql # 配置MySQL pymysql.install ...
- Django配置Mysql数据库 (Pycharm)
Django配置MySQL数据库方法 一.settings.py文件中修改数据库配置为下面的内容: # Database # https://docs.djangoproject.com/en/2.0 ...
- Django 配置MySQL数据库 mysql
Django 配置MySQL数据库 在settings.py中配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # ...
- Django配置MariaDB数据库
Django中配置MariaDB数据库.配置文件如下: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': ...
- 【python-Django开发】Django 配置MySQL数据库讲解!!!
官方文档请阅读:https://docs.djangoproject.com/en/1.11/ref/databases/#mysql-db-api-drivers 配置MySQL数据库 1. 新建M ...
- Django配置实现数据库读写分离
django在进行数据库操作的时候,读取数据与写数据(增.删.改)可以分别从不同的数据库进行操作. 1. 在配置文件中增加slave数据库的配置 2. 创建数据库操作的路由分发类 在meiduo_ma ...
- django配置-mysql数据库相关配置
Django3版本之前的配置 1. Django默认配置的数据库是sqlite 2. 使用mysql数据库需要下载的包 pip3 install PyMySQL 3. Django配置PyMySQL ...
- Django 配置MySQL数据库
在settings.py中配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'NAME': 'my ...
- Django配置MySQL数据库
一.在settings.py中配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'NAME': ' ...
随机推荐
- Atitit JAVA p2p设计与总结 JXTA 2
Atitit JAVA p2p设计与总结 JXTA 2 JXTA 2 是开放源代码 P2P 网络的第二个主要版本,它利用流行的.基于 Java 的参考实现作为构建基础.在设计方面进行了重要的修改,以 ...
- Ecmall二次开发-增删改查操作
Ecmall二次开发-增删改查操作 Model目录includes/models 自己添加需要的model class OrdercomplainModel extends BaseModel //类 ...
- poj 1806 Frequent values(RMQ 统计次数) 详细讲解
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1806 题目大意:给你一个非降序排列的整数数组,你的任务是对于一系列的询问,(i,j),回答序列中出现次 ...
- PBOC联机交易中ARQC及ARPC的计算
金融IC卡在申请联机交易时,终端会进行发卡行认证,验证卡片的合法性,终端通过GAC得到卡片返回的ARQC,与终端自身产生的ARQC进行比较,如果一致,则说明是由发卡行发行的合法卡片,同时对ARQC及认 ...
- (译)Getting Started——1.2.3 Defining the Interaction(定义交互)
IOS应用编程是基于事件驱动的编程.也就是说,应用的流程由事件来决定:事件包括系统事件和用户操作.界面上用户执行的操作会触发事件.这些事件导致应用的逻辑被执行,数据被操作.应用对用户动作的响应反映在界 ...
- UVA 11732 "strcmp()" Anyone? (Trie)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- 本地连接linux虚拟机的方法
1.给虚拟机添加一个ehtX: 2. 3.添加一个ethX 4. 5.设置使用的是哪一个网卡,ifconfig的时候变会得到相应的ip 6. 再在cmd那ping ifconfig出来的自动获取的ip ...
- java垃圾回收算法和垃圾收集器
垃圾收集算法.垃圾回收算法.java垃圾收集器 目录1. 垃圾收集算法1)引用计数法2)根搜索法2. 垃圾回收算法1)复制算法2)标记-清除算法3)标记-整理算法4)分代收集算法3. java垃圾收集 ...
- WPF之数据绑定
WPF学习之数据绑定 1. Banding基础 WPF中的数据绑定提供了很强大的功能.与普通的WinForm程序相比,其绑定功能为我们提供了很多便利,例如Binding对象的自动通知/刷新,Conve ...
- Android无线测试之—UiAutomator UiScrollable API介绍二
快速滑动 一.快速滑动相关概念 1.步长:从一点滑动到另一点所用的时间 2.扫动次数:例如列表,要滑动多少次才能到底部,这个滑动次数就是扫动次数 二.相关API 返回值 API 描述 boolean ...