1.在setting.py文件中设置数据库引擎、数据库名字和数据库路由:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
"testmultidb_db1": {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'test_db1.sqlite3'),
},
}
# use multi-database in django
# 这里如果写了下面这个数据库路由,那么在app文件夹下的views里就不用写using("哪个数据库")了,
# 如:models.TestInfo.objects.using("testmultidb_db1").create(aaa=username)
# 所以为了可读性,不建议写下面的数据库路由,app要使用其他数据库的话,可以直接写objects.using("哪个数据库")
DATABASE_ROUTERS = ['mysite.database_router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {
# example:
# 'app_name':'database_name',
'testmultidb': 'testmultidb_db1',
}
2.如果在setting.py里写了上面的那个数据库路由,则需要在mysite/mysite/文件夹内创建database_router.py,并粘贴如下代码:
# -*- coding: utf-8 -*-
from django.conf import settings
DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
class DatabaseAppsRouter(object) :
"""
A router to control all database operations on models for different
databases.
In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
will fallback to the `default` database.
Settings example:
DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
"""
def db_for_read(self, model, **hints) :
""""Point all read operations to the specific database."""
if model._meta.app_label in DATABASE_MAPPING :
return DATABASE_MAPPING[model._meta.app_label]
return None
def db_for_write(self, model, **hints) :
"""Point all write operations to the specific database."""
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."""
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
# for Django 1.4 - Django 1.6
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
# Django 1.7 - Django 1.11
def allow_migrate(self, db, app_label, model_name=None, **hints) :
if db in DATABASE_MAPPING.values() :
return DATABASE_MAPPING.get(app_label) == db
elif app_label in DATABASE_MAPPING :
return False
return None