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
相关产品推荐
相关产品推荐

