Django 中实现连接多个数据库并实现读写分离
读写分离
其基本原理就是让主数据库处理事务性增,改,删操作(INSERT,UPDATE,DELETE)操作,而从数据库处理SELECT查询操作,数据库复制被用来把事物性操作导致的变更同步到其他从数据库,以SQL为例,主数据库负责写数据,读数据,读库仅负责读数据,每次有写库操作,同步更新到读库,写库就一个,读库可以有多个,采用日志同步的方式实现主库和多个数据库的数据同步
具体配置如下
在配置文件中增加slave数据库的配置
在Django的配置文件settings.py中,DATABASES中添加代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
DATABASES = { 'default' : { 'ENGINE' : 'django.db.backends.mysql' , 'HOST' : '127.0.0.1' , # 主服务器的运行ip 'PORT' : 3306 , # 主服务器的运行port 'USER' : 'django' , # 主服务器的用户名 'PASSWORD' : 'django' , # 主服务器的密码 'NAME' : 'djangobase' # 数据表名 }, 'slave' : { 'ENGINE' : 'django.db.backends.mysql' , 'HOST' : '127.0.0.1' , 'PORT' : 8306 , 'USER' : 'django_slave' , 'PASSWORD' : 'django_slave' , 'NAME' : 'djangobase_slave' } } |
创建数据库操作的路由分类
在项目的utils中创建db_router.py文件,并在该文件中定义一个db类,用来进行读写分离
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class MasterSlaveDBRouter( object ): """数据库主从读写分离路由""" def db_for_read( self , model, * * hints): """读数据库""" return "slave" def db_for_write( self , model, * * hints): """写数据库""" return "default" def allow_relation( self , obj1, obj2, * * hints): """是否运行关联操作""" return True |
配置读写分离路由
在配置文件中增加
1
2
|
#配置读写分离 DATABASE_ROUTERS = [ '项目名.utils.db_router."自定义的类名称"' ] |