Django使用多数据库——多数据库的连接

一、多数据库settings配置

假设有一个Mydjango的项目为例,在项目中创建应用index和user,并在配置文件settings.py的INSTALLED_APPS中注册。
下面以连接3个数据库示例:
分别是项目内置的db.sqlite3、MySQL的indexdb和userdb。

# settings.py中的DATABASES
# 其中default为Django默认使用的数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'db1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'indexdb',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'port': '3306',
    },
    'db2': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'userdb',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'port': '3306',
    },  
}

除了设置DATABASES属性之外,还需要设置配置属性DATABASE_ROUTERS和DATABASE_APPS_MAPPING,配置信息如下:

# 记得还要新增dbRouter.py并编写类DbAppsRouter
DATABASE_ROUTERS = ['MyDjango.dbRouter.DbAppsRouter']
DATABASE_APPS_MAPPING = {
    # 设置每个app的模型使用的数据库
    # {'app_name' : 'database_name'}
    'admin': 'default',
    'index': 'db1',
    'user': 'db2',
}

二、创建dbRouter.py文件并编写类DbAppsRouter

由于DATABASE_ROUTERS指向MyDjango文件夹的dbRouter.py文件,因此在MyDjango文件夹里创建dbRouter.py文件,文件名并不固定,可自行命名,只需与settings对应即可。类名同理。

from django.conf import settings

DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING


class DbAppsRouter(object):
    def db_for_read(self, model, **hints):
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def allow_relation(selfs, obj1, obj2, **hints):
        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_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

变量DATABASE_MAPPING从配置文件里获取配置属性DATABASE_APPS_MAPPING的值;类DbAppsRouter根据变量DATABASE_MAPPING(数据库与项目的映射关系)来设置数据库的读取、写入、数据表关系和数据迁移。

多数据库如何使用请看另外一篇文章——多数据的使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容