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

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

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

片刻发布于 2025/1/19更新于 2026/10/2079 浏览
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 import settings

DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING

class DatabaseAppsRouter(object):
    """
    控制不同模型在不同数据库上的操作。
    若未在 DATABASE_APPS_MAPPING 中设置,则回退到 default 数据库。
    """
    
    def db_for_read(self, model, **hints):
        """读取操作指向指定数据库"""
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def db_for_write(self, model, **hints):
        """写入操作指向指定数据库"""
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """允许同一数据库内的关联"""
        db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
        db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
        if db_obj1 and db_obj2:
            return db_obj1 == db_obj2
        return None

    def allow_migrate(self, db, app_label, model=None, **hints):
        """确保 App 只出现在对应的数据库中"""
        if db in DATABASE_MAPPING.values():
            return DATABASE_MAPPING.get(app_label) == db
        elif app_label in DATABASE_MAPPING:
            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. 手动管理表结构

更多推荐文章

查看全部
  • 从零手写 Linux 简易 Shell:内建命令、环境变量与进程替换详解
  • 算法实战:位运算解决两数之和与缺失数字问题
  • 大模型落地为何优先选择知识库场景
  • 昇腾平台 DeepSeek-R1 与 Qwen2.5 强化学习训练优化实践
  • 利用 vue-video-player 播放 m3u8 视频流
  • cocotb平台用VCS仿Xilinx FPGA
  • 使用 TRAE CN 与 MasterGo MCP 将设计稿转化为前端代码
  • 法奥机器人ROS2环境搭建
  • 宇树 Unitree 机器人 ROS 2 环境部署指南 (Humble + 真实硬件)
  • WebGIS 开发实战:WKT 转 GeoJSON 技巧与 Leaflet 加载应用
  • 基于 OpenClaw 与 Open WebUI 的企业多部门 AI 平台部署方案
  • Typora 的安装与基础设置
  • Linux 简易版 SHELL 实现
  • 基于 PGD 的 Stable Diffusion 视觉提示词注入攻击实战
  • Apache HTTP Server 详细介绍与配置指南
  • 大模型快速部署与高效推理:GGUF 格式模型介绍与使用教程
  • Java Compiler API 核心原理与应用场景
  • 可解释人工智能:从经典模型到大规模语言模型全解析
  • OpenClaw 功能、Ubuntu 部署、扩展与 AI Native 架构借鉴
  • OpenClaw 飞书机器人权限配置与安全指南

相关免费在线工具

  • 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