前言
django中配置多数据库
一、settings 配置更改
1.加数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'blog', # 数据库名
'HOST': '127.0.0.1', # 数据库服务器地址
'USER': 'root', # 用户名
'PASSWORD': 'xxx', # 密码
'PORT': '3306',
},
'db01': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db_01'),
},
'db02': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db_02'),
},
}
举例3个数据库,一个default默认库(必须有),一个 db01 和 db02 以字典的形式添加
2.导入路由规则配置文件:
DATABASE_ROUTERS = ['Prject.database_router.DatabaseAppsRouter']
Project: 建立的django项目名称(project_name) 这里有个坑,如果系统设置了默认路径就是项目根目录的话则不需要Project,直接如下定义路由文件地址:
DATABASE_ROUTERS = ['database_router.DatabaseAppsRouter']
database_router: 定义路由规则database_router.py
文件名称, 这个文件名可以自己定义
DatabaseAppsRouter: 路由规则的类名称,这个类是在database_router.py
文件中定义
3.设置APP与数据库对应关系
DATABASE_APPS_MAPPING = {
# example:
# 'app_name':'database_name',
'app02': 'db02',
'app01': 'db01',
'admin': 'default',
'auth': 'default',
'contenttypes': 'default',
'sessions': 'default',
}
以上的app01, app02是项目中的 APP名,分别指定到 db01, db02 的数据库。
为了使django自己的表也创建到你自己定义的数据库中,你可以指定 : admin, auth, contenttypes, sessions 到设定的数据库中,如果不指定则会自动创建到默认(default)的数据库中。
二、添加数据库路由规则文件
工程目录内添加database_router.py
文件:
# -*- coding: utf-8 -*-
from django.conf import settings
DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
class DatabaseAppsRouter(object):
def db_for_read(self, model, **hints):
""""建议model类型对象从哪一个数据库读取."""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None
def db_for_write(self, model, **hints):
"""建议model类型对象的写入操作应该使用哪个数据库"""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None
def allow_relation(self, obj1, obj2, **hints):
"""Allow any relation between apps that use the same database.
如果obj1 和obj2 之间应该允许关联则返回True,如果应该防止关联则返回False,如果路由无法判断则返回None
"""
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 True
else:
return False
return None
def allow_syncdb(self, db, model):
"""Make sure that apps only appear in the related database."""
if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(model._meta.app_label) == db
elif model._meta.app_label in DATABASE_MAPPING:
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.
定义迁移操作是否允许在别名为db的数据库上运行。如果操作应该运行则返回True ,如果不应该运行则返回False,如果路由无法判断则返回None。
"""
if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(app_label) == db
elif app_label in DATABASE_MAPPING:
return False
return None
三、各个App下创建models文件
创建数据库并进行数据迁移生成数据表
./python manage.py makemigrations
./ manage.py migrate --database=db01
./ manage.py migrate --database=db02
./ manage.py migrate
需要逐个数据库迁移 如不制定数据库则迁移默认数据库
四、反向生产models文件
python manage.py inspectdb --database=db01 > app01/models.py
以此类推分别生成