Django多数据库问题:子应用表重复创建至默认数据库
问题原因与解决方案
核心原因
Django数据库路由器的执行逻辑是:依次调用所有路由器的allow_migrate方法,只要有一个路由器返回True就允许迁移;如果所有路由器都返回None,Django会默认允许在default数据库执行迁移。
你的子应用路由器仅在app_label='subapp_name'且db='subapp_name'时返回True,其他情况返回None;默认路由器对subapp_name这个app_label也返回None。此时所有路由器都没给出明确禁止的指令,Django就触发默认行为,把subapp_name的表也建到了默认数据库里。
修复方案
修改子应用路由器的allow_migrate方法,当app_label='subapp_name'但目标数据库不是subapp_name时,明确返回False,阻止在其他数据库创建该应用的表:
def allow_migrate(self, db, app_label, model_name=None, **hints): if app_label == 'subapp_name': # 仅允许在subapp_name数据库迁移该应用的表,其他数据库直接禁止 return db == 'subapp_name' return None
额外验证点
- 确认
INSTALLED_APPS中已正确添加subapp_name - 迁移时可指定数据库分别执行:
python manage.py migrate --database=subapp_name(子应用库)、python manage.py migrate --database=default(默认库),确保各自迁移仅在对应库生效
内容的提问来源于stack exchange,提问作者EviSvil
相关产品推荐
相关产品推荐

