Django 数据库基础
Django 项目初始化后默认使用 SQLite3,但在生产环境中,我们往往需要更强大的关系型数据库支持。除了单库连接,实际业务中常涉及读写分离、多数据库甚至主从架构。本文将重点介绍多数据库连接的配置方案。
多数据库连接配置
1. 定义数据源
在 settings.py 中配置 DATABASES 字典,可以定义多个数据库实例。这里以 MySQL 8.0 为例:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': 'localhost',
'PORT': '3306',
'NAME': 'db1',
'USER': 'root',
'PASSWORD': 'root',
},
'system': {
'ENGINE': 'django.db.backends.mysql',
'HOST': 'localhost',
'PORT': '3306',
'NAME': 'db2',
'USER': 'root',
'PASSWORD': 'root',
}
}
如果不想使用默认数据库,可以将 default 设为空或移除,仅保留自定义键名。
2. 配置数据库路由
为了让不同应用(App)的数据写入不同的数据库,我们需要编写数据库路由器。在 settings.py 同级目录创建 database_router.py 文件。
首先启用路由:
DATABASE_ROUTERS = ['database_router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {
'mydefault': 'default',
'mysystem': 'system',
}
接着实现路由类逻辑:
from django.conf settings
DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
():
():
model._meta.app_label DATABASE_MAPPING:
DATABASE_MAPPING[model._meta.app_label]
():
model._meta.app_label DATABASE_MAPPING:
DATABASE_MAPPING[model._meta.app_label]
():
db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
db_obj1 db_obj2:
db_obj1 == db_obj2
():
db DATABASE_MAPPING.values():
DATABASE_MAPPING.get(app_label) == db
app_label DATABASE_MAPPING:

