django 配置多数据库进行读写分离
DATABASES
配置
在Django的配置文件 setting.py 中的DATABASES
参数中,添加多个数据库的配置信息。每个数据库都需要指定ENGINE(数据库引擎)和NAME(数据库名称)。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'master_db',
'USER': 'master_user',
'PASSWORD': 'master_password',
'HOST': 'localhost',
'PORT': '3306',
},
'slave': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'slave_db',
'USER': 'slave_user',
'PASSWORD': 'slave_password',
'HOST': 'localhost',
'PORT': '3307',
}
}
方式一:自选读写数据库对象
在需要进行读写操作的地方,可使用.using('default')
方法来指定使用哪个数据库进行操作('default'是配置文件中DATABASES定义的数据库对象)。
result = My_Model.objects.filter(id=5).using('default') # .using('slave')
方式二:自动读写分离(推荐)
(一)创建一个Py文件,命名为db_router.py,并在其中定义一个类DBRouter,继承自django.db.utils.BaseDatabaseRouter,该类用于自动路由数据库。在DBRouter类中,需要实现db_for_read()和db_for_write()方法,这两个方法分别用于决定读操作和写操作使用的数据库。
class DBRouter(object):
def db_for_read(self, model, **hints):
# 多个从库 ['db1','db2','db3'] ---- 负载 --- random
# 自读数据库
return 'slave'
def db_for_write(self, model, **hints):
# 可写入的数据库
return 'default'
(二)在Django的配置文件 setting.py 的DATABASE_ROUTERS
中,指定使用自定义的DBRouter类来进行数据库路由。
DATABASE_ROUTERS = ['myapp.db_router.DBRouter']