Django如何仅对MongoDB中指定应用执行migrate迁移操作
问题根源
你的数据库路由allow_migrate方法对不属于models_logging的应用返回了None,按照Django的路由规则:如果所有注册的路由对某条迁移操作都返回None,Django会默认允许该迁移执行,所以其他应用的表也会被同步到thor数据库。
修复步骤
- 第一步:修改
allow_migrate方法的默认返回逻辑
非models_logging的应用如果要往thor数据库迁移时直接返回False,修改后的完整路由代码如下:
class AuthRouter(object): """ 控制models_logging应用所有数据库操作的路由 """ route_app_labels = {'models_logging'} def db_for_read(self, model, **hints): """ 读取models_logging应用的模型时走thor库 """ if model._meta.app_label == 'models_logging': return 'thor' return None def db_for_write(self, model, **hints): """ 写入models_logging应用的模型时走thor库 """ if model._meta.app_label == 'models_logging': return 'thor' return None def allow_relation(self, obj1, obj2, **hints): """ 允许涉及models_logging应用模型的关联关系 """ if obj1._meta.app_label == 'models_logging' or \ obj2._meta.app_label == 'models_logging': return True return None def allow_migrate(self, db, app_label, model_name=None, **hints): """ 仅允许models_logging应用迁移到thor库,thor库禁止其他应用迁移 """ if app_label == 'models_logging': return db == 'thor' # 新增逻辑:非models_logging应用,禁止往thor库迁移 if db == 'thor': return False return None
- 第二步:确认项目配置正确
检查settings.py中已经将该路由添加到DATABASE_ROUTERS配置项,示例如下:
# 替换为你路由类的实际导入路径 DATABASE_ROUTERS = ['myapp.routers.AuthRouter',]
- 第三步:(可选)执行迁移时指定应用名
要彻底避免误迁移其他应用,可以在执行迁移命令时直接指定应用名:python manage.py migrate models_logging --database=thor
内容的提问来源于stack exchange,提问作者Syed Muhammad Ibrahim
相关产品推荐
相关产品推荐

