# Django多数据库使用记录
2 min read
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