Django单元测试:如何为多数据库分别执行迁移?
Django多数据库测试时指定应用迁移到对应数据库的解决方案
要解决跨数据库重复迁移引发的"对象已存在"错误,核心是通过数据库路由控制每个应用的迁移仅在对应的数据库执行,具体步骤如下:
创建数据库路由文件
在项目根目录下新建database_router.py,写入以下代码:class AppDatabaseRouter: def db_for_read(self, model, **hints): if model._meta.app_label == 'app_a': return 'default' elif model._meta.app_label == 'app_b': return 'other_db' return None def db_for_write(self, model, **hints): if model._meta.app_label == 'app_a': return 'default' elif model._meta.app_label == 'app_b': return 'other_db' return None def allow_migrate(self, db, app_label, model_name=None, **hints): # 关键逻辑:限制应用只能在指定数据库执行迁移 if app_label == 'app_a': return db == 'default' elif app_label == 'app_b': return db == 'other_db' return None在settings.py中配置路由
修改项目的settings.py,添加路由配置(替换你的项目名称为实际项目目录名):DATABASE_ROUTERS = ['你的项目名称.database_router.AppDatabaseRouter']运行测试
配置完成后直接执行测试命令即可:python manage.py test若存在残留测试数据库导致异常,可先清理再运行:
python manage.py test --noinput
该方案通过路由的allow_migrate方法,严格绑定应用与对应数据库的迁移关系,从根源上避免了跨数据库重复迁移的问题。
内容的提问来源于stack exchange,提问作者James Lin
相关产品推荐
相关产品推荐

