Django多数据库路由

因为需要基于一个老的业务系统进行相关开发工作、老系统使用的数据库是Oracle11G。在开发过程中不方便对老系统的数据库进行改动、而我们又需要增加用户登录、系统日志、权限管理等功能。需要在新增数据表、那么在Django中我们如何来操作呢?

Django版本:1.11.29(这里为了适配Oracle11G数据库)

MySQL版本:5.6.49(新增数据表全部放在MySQL数据库中)

多数据库配置

下面我们一起来看看如何在Django中进行多数据库路由配置。首先我们去新建项目的setting.py文件里面配置多个数据库引擎(项目创建过程略过)。

DATABASES = {
    'default': {
        # 主数据库
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'z0ukun',
        'USER': 'z0ukun',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'slave': {
        # 从数据库
        'ENGINE': 'django.db.backends.oracle',
        'NAME': '127.0.0.1:1521/z0ukun',
        'USER': 'z0ukun',
        'PASSWORD': '123456',
    },
}

# 引入数据库路由配置
DATABASE_ROUTERS = ['settings.router.Slave_Router']

我们把MySQL数据库作为主数据库、把Oracle数据库作为从数据库(这里的主从数据库引擎可以是一样的、也可以是不一样的、不同的数据库引擎配置请各位小伙伴自行百度)。这里我们链接的Oracle数据库是老业务系统的数据库(只读权限)、而MySQL数据库是我们需要新增数据表的数据库(读写权限)。

多数据库路由配置

然后我们去Django项目目录里面新增一个settings目录、在settings目录下面新增一个router.py文件内容如下:

class Slave_Router(object):
    """
    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.
        """
        if model._meta.app_label == 'reservation':
            return 'slave'
        return 'default'

    def db_for_write(self, model, **hints):
        """
        Attempts to write auth models go to auth_db.
        """
        if model._meta.app_label == 'reservation':
            return 'slave'
        return 'default'

    def allow_relation(self, obj1, obj2, **hints):
        """
        Allow relations if a model in the auth app is involved.
        """
        if obj1._meta.app_label == 'reservation' or \
                obj2._meta.app_label == 'reservation':
            return True
        return 'default'

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        Make sure the auth app only appears in the 'auth_db'
        database.
        """
        if app_label == 'reservation':
            return db == 'slave'
        return db == 'default'

这里我们定义了一个通用函数Slave_Router,在Slave_Router中我们定义了read、write、relation、migrate几个方法。我们把从老业务系统反向生成的Model类全部放在 reservation APP 下面。通过Slave_Router来判断如果当前访问的APP是 reservation 就去访问slave数据库(也就是Oracle数据库)、反之则去访问 default 数据库(也就是MySQL数据库)。通过这种方式、我们就实现了在Django下面去访问多个数据库的配置方式。

注:这一部分的内容其实在官方文档里面写的也挺清楚的、感兴趣的小伙伴可以自动取官方文档查看原原档。

官方链接:https://docs.djangoproject.com/zh-hans/2.0/topics/db/multi-db/

推荐文章