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

Django多数据库场景下如何仅迁移指定业务表到目标数据库

解决方案

问题原因

你当前的MultiDBRouter中allow_migrate方法仅对stage1应用做了判断,其余应用返回None,Django在路由返回None时默认允许迁移操作,因此auth、session、admin等Django内置应用的表会被同步到stage1数据库。

修改步骤

1. 调整数据库路由的allow_migrate逻辑

明确限制stage1数据库仅允许stage1应用的迁移操作,修改后的路由代码如下:

# stage1.routers.py
class MultiDBRouter(object):
    
    def __init__(self):
        self.model_list = ['stage1']

    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.model_list:
            return model._meta.app_label
        return None
    
    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'stage1':
            return 'stage1'
        return None
    
    def allow_relation(self, obj1, obj2, **hints):
        if (obj1._meta.app_label in self.model_list or obj2._meta.app_label in self.model_list):
            return True
        return None
    
    def allow_migrate(self, db, app_label, model_name=None, **hints):
        # stage1库仅允许stage1应用迁移
        if db == 'stage1':
            return app_label == 'stage1'
        # 其他库不允许stage1应用迁移
        elif app_label == 'stage1':
            return False
        # 其余场景走默认逻辑
        return None

2. 清理stage1数据库已有冗余表

可任选一种方式清理:

  • 直接登录stage1对应的MySQL库,删除除stage1_room之外的所有表
  • 直接删除stage1库后重新创建同名空库

3. 执行指定应用的迁移命令

不需要全量迁移,直接指定迁移stage1应用即可:

python manage.py migrate stage1 --database=stage1

Django内置应用的迁移正常执行默认库的迁移即可:

python manage.py migrate

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:06:00