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%