Python公开课 - Django配置多源数据库
前言
在django项目中, 一个工程中存在多个APP应用很常见. 有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接。
具体步骤如下:
第一步 新建一个app
通过命令如下:
django-admin startapp test
其中的model.py文件中,有一个名为ABC
的model
第二步 在settings.py中增加这个app
INSTALLED_APPS = [
xxx1,
xxx2,
test
]
第三步 在settings.py中进行多源数据库配置
参看具体配置如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db/default.sqlite3'),
},
# sqlite 配置
'test': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db/test.sqlite3'),
},
# mysql 配置,请取消注释
#'test': {
# 'NAME': 'test',
# 'ENGINE': 'django.db.backends.mysql',
# 'USER': 'mysql_cust',
# 'PASSWORD': 'veryPriv@ate'
# }
}
第四步 在settings.py中进行数据库路由配置
- Project: 建立的django项目名称(project_name) , 这里为
xtuz
- database_router: 定义路由规则database_router.py 文件名称, 这个文件名可以自己定义,这里为
database_router
- DatabaseAppsRouter: 路由规则的类名称,这个类是在database_router.py 文件中定义,这里为
MyRouter
DATABASE_ROUTERS = ['xtuz.database_router.MyRouter']
DATABASE_APPS_MAPPING = {
'test.abc': 'test',
}
第五步 编辑路由文件 xtuz.database_router.py
from django.conf import settings
DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
class MyRouter(object):
def get_db(self, model):
if model._meta.label_lower.startswith('test.abc') == True:
return 'test'
else:
return None
"""
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.
"""
return self.get_db(model)
def db_for_write(self, model, **hints):
"""
Attempts to write auth models go to auth_db.
"""
return self.get_db(model)
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the auth app is involved.
"""
db_obj1 = DATABASE_MAPPING.get(obj1._meta.label_lower)
db_obj2 = DATABASE_MAPPING.get(obj2._meta.label_lower)
if db_obj1 and db_obj2:
if db_obj1 == db_obj2:
return True
else:
return False
return None
def allow_migrate(self, db, app_label, model=None, **hints):
"""
Make sure the auth app only appears in the 'auth_db'
database.
"""
if model:
db_obj = DATABASE_MAPPING.get(model._meta.label_lower, 'default')
if db == db_obj:
return True
else:
return False
return None
第六步 数据库migrate
命令如下
python3 manage.py makemigrations
python3 manage.py migrate --database=test
需要加上 –database 参数,如果不加则无法正常建表
展开剩余53%