因为需要基于一个老的业务系统进行相关开发工作、老系统使用的数据库是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/