You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django多数据库迁移实现咨询:多模型分库存储配置方案

嘿,我刚好在Django 2.x环境下处理过类似的多模型分库迁移场景,结合你的配置(Python 3.6、PostgreSQL可选),给你梳理下完整的操作步骤:

1. 先确认数据库配置(settings.py)

首先要在项目的settings.py里配置好所有需要用到的数据库,比如你提到的default和mydb02:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',  # 也可替换为sqlite3/mysql,按需选择
        'NAME': 'your_default_db_name',
        'USER': 'db_user',
        'PASSWORD': 'db_password',
        'HOST': 'localhost',
        'PORT': '5432',
    },
    'mydb02': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydb02_db_name',
        'USER': 'db_user',
        'PASSWORD': 'db_password',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}
2. 配置数据库路由(关键!)

因为你通过模型的Meta.database指定了存储库,需要让Django知道如何把模型和对应的数据库绑定。创建一个router.py文件放在项目根目录下:

class DatabaseRouter:
    # 读取数据时,使用模型Meta指定的数据库,默认用default
    def db_for_read(self, model, **hints):
        return getattr(model._meta, 'database', 'default')

    # 写入数据时同理
    def db_for_write(self, model, **hints):
        return getattr(model._meta, 'database', 'default')

    # 控制迁移:只允许模型在自己指定的数据库上执行迁移
    def allow_migrate(self, db, app_label, model_name=None, **hints):
        model = hints.get('model')
        if model:
            # 匹配模型指定的数据库和当前要迁移的数据库
            return getattr(model._meta, 'database', 'default') == db
        return None

然后在settings.py里添加路由配置(替换your_project_name为你实际的项目名称):

DATABASE_ROUTERS = ['your_project_name.router.DatabaseRouter']
3. 生成迁移文件

和常规操作一样,先生成所有模型的迁移文件,Django会自动识别每个模型的数据库归属:

python manage.py makemigrations

这一步会在每个包含模型的app的migrations目录下生成对应的迁移文件,不需要手动拆分。

4. 针对每个数据库应用迁移

因为Django默认只会处理default数据库,所以需要分别给每个数据库执行迁移:

  • 迁移默认数据库:
python manage.py migrate --database=default
  • 迁移mydb02数据库:
python manage.py migrate --database=mydb02

执行后,MyModel02会被创建在mydb02中,MyModel01和MyModel03(未指定database)则会被创建在default数据库里。

额外注意事项
  • 如果某个app下的模型分属不同数据库,migrate --database=xxx会自动通过路由筛选出属于该数据库的模型,无需手动修改迁移文件。
  • 可以用python manage.py inspectdb --database=mydb02命令查看mydb02中的表结构,验证迁移是否成功。
  • 确保你添加models.options.DEFAULT_NAMES += ('database',)的代码在模型加载前执行(比如放在项目的__init__.py或者app的models.py开头),避免Django忽略Meta.database字段。

内容的提问来源于stack exchange,提问作者baldr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:28:52