跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Django 多数据库连接配置与迁移管理实战

Django 多数据库连接配置涉及 DATABASES 设置与自定义 Router 路由。通过 DATABASE_APPS_MAPPING 映射应用至不同数据源,配合 migrate 命令完成迁移。支持重置迁移文件整理结构,以及通过 managed=False 手动管理现有表结构,满足复杂生产环境需求。

片刻发布于 2025/1/19更新于 2026/6/917 浏览
Django 多数据库连接配置与迁移管理实战

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:
             
         
import
class
DatabaseAppsRouter
object
""" 控制不同模型在不同数据库上的操作。 若未在 DATABASE_APPS_MAPPING 中设置,则回退到 default 数据库。 """
def
db_for_read
self, model, **hints
"""读取操作指向指定数据库"""
if
in
return
return
None
def
db_for_write
self, model, **hints
"""写入操作指向指定数据库"""
if
in
return
return
None
def
allow_relation
self, obj1, obj2, **hints
"""允许同一数据库内的关联"""
if
and
return
return
None
def
allow_migrate
self, db, app_label, model=None, **hints
"""确保 App 只出现在对应的数据库中"""
if
in
return
elif
in
return
False
return
None

路由的核心逻辑是匹配模型的 app_label 与映射表。对于跨库关联,allow_relation 会限制只有同库模型才能建立外键关系。

3. 模型映射

在创建 Model 时,通过 Meta 类指定 app_label,使其对应到路由中的键名:

from django.db import models

class User(models.Model):
    username = models.CharField(verbose_name="用户名", max_length=64)
    password = models.CharField(verbose_name="用户密码", max_length=64)

    class Meta:
        db_table = "userInfo"
        app_label = 'mysystem'  # 对应路由中的 system 库

迁移管理

配置完成后,需要通过命令行将模型同步到数据库。

基础迁移

生成迁移文件并应用到指定数据库:

# 生成迁移文件
python manage.py makemigrations

# 迁移到默认库
python manage.py migrate

# 迁移到特定库
python manage.py migrate --database=app
python manage.py migrate --database=system

重置迁移文件

多次修改模型会导致迁移文件碎片化,此时可尝试重置结构:

  1. 检查当前迁移状态:

    python manage.py showmigrations
    

    [x] 表示已执行,[ ] 表示未执行。

  2. 模拟回滚到初始状态(注意替换为你的 App 名称):

    python manage.py migrate --fake mysystem zero
    
  3. 清理旧的迁移文件(保留 __init__.py): 删除 migrations 文件夹下除 __init__.py 外的所有 .py 文件及 __pycache__。

  4. 重新生成迁移:

    python manage.py makemigrations
    
  5. 验证 SQL 并执行迁移:

    python manage.py sqlmigrate mysystem 0001_initial
    python manage.py migrate --database=system
    

手动管理表结构

对于已存在的系统表或特殊需求,可以通过设置 managed = False 让 Django 不再自动管理该表的增删改查:

class MyTable(models.Model):
    # ... fields ...

    class Meta:
        managed = False

开启此选项后,Django 不会在迁移中创建或删除该表,适合对接遗留系统或手动维护的表结构。在使用前建议先熟悉 Django 框架自带的表结构及其用途,以便更好地进行手动控制。

目录

  1. Django 数据库基础
  2. 多数据库连接配置
  3. 1. 定义数据源
  4. 2. 配置数据库路由
  5. 3. 模型映射
  6. 迁移管理
  7. 基础迁移
  8. 生成迁移文件
  9. 迁移到默认库
  10. 迁移到特定库
  11. 重置迁移文件
  12. 手动管理表结构
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Python 网络爬虫技术详解
  • 用 OpenClaw 和 Claude 搭建自动化写作系统
  • RTAB-Map 论文阅读:核心原理与架构解析
  • JavaAI 工具:重塑 Java 开发的智能新范式
  • VR 健身应用实战:基于 SideQuest 与 Unity 的开发全流程
  • Web 安全漏洞挖掘实战:从信息收集到逻辑漏洞利用
  • 安卓系统层开发:C++ 与 JNI 实战
  • 关于人工智能与人类边界:一场深度哲学对话
  • 基于 LLaMA-Factory 的 DPO 训练实战指南
  • 基于 LLaMA-Factory 的 DPO 训练实战教程
  • AI 实践:Token 与上下文窗口
  • 黑客入门教程:安全工程师能力要求与学习路线
  • Windows 安装 OpenClaw 配置 Qwen 与 Ollama 本地模型及飞书机器人
  • Midjourney 使用指南
  • STL 底层解析:map/set 基于红黑树的封装与迭代器实现
  • 数据结构与算法:递归原理及 Java 实现案例
  • GitHub Copilot AI 编程助手安装与使用指南
  • Web 团队开发 App,是否应该选择 Capacitor?
  • SimVascular 医学影像血流仿真开源工具指南
  • Comfy-Photoshop-SD:革命性AI绘画集成解决方案深度解析

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online