Django多数据库配置异常:sqlite3库表分配不符合预期
问题排查与解决方案
1. 修正数据库路由类的核心逻辑
你的问题大概率出在路由类的allow_migrate方法逻辑不精准,导致所有迁移被应用到了两个数据库。下面是正确的路由实现,重点看迁移控制部分:
class SolDataRouter: def db_for_read(self, model, **hints): # 仅sol_app的两个指定模型走sol_data_db if model._meta.app_label == 'sol_app' and model.__name__ in ['SolModel1', 'SolModel2']: return 'sol_data_db' # 其余所有模型(含Django内置)走default return 'default' def db_for_write(self, model, **hints): # 读写路由保持一致 return self.db_for_read(model, **hints) def allow_relation(self, obj1, obj2, **hints): # 只允许同数据库内的模型关联,跨库直接拒绝 if obj1._state.db == obj2._state.db: return True return None def allow_migrate(self, db, app_label, model_name=None, **hints): # 核心:精准控制每个迁移的数据库 if app_label == 'sol_app': # sol_app下仅指定的两个模型允许在sol_data_db迁移 # 注意这里model_name是小写,和迁移文件里的字段一致 if model_name in ['solmodel1', 'solmodel2']: return db == 'sol_data_db' # sol_app内其他模型(如果有的话)禁止迁移 return False else: # 非sol_app的所有应用(含Django内置)仅允许在default迁移 return db == 'default'
2. 清理错误的历史迁移与数据库
之前的错误操作已经让两个数据库混入了不该有的表,必须彻底清理:
- 删除
db.sqlite3和sol_data.sqlite3两个数据库文件 - 删除所有应用
migrations目录下,除了__init__.py之外的所有迁移文件和__pycache__文件夹
3. 按正确顺序重新执行迁移
绝对不要直接执行不带--database参数的migrate命令,这会让Django把所有迁移应用到所有数据库,这就是你之前的问题根源。正确步骤:
- 生成所有应用的迁移文件:
python manage.py makemigrations - 给
default数据库执行迁移(仅处理非sol_app的模型):python manage.py migrate --database=default - 给
sol_data_db数据库执行迁移(仅处理指定的两个模型):python manage.py migrate --database=sol_data_db
4. 验证路由是否生效
进入Django Shell快速验证:
python manage.py shell
执行以下代码确认路由分配:
from sol_app.models import SolModel1, SolModel2 from django.contrib.auth.models import User # 应该输出sol_data_db print(SolModel1.objects.db) # 应该输出sol_data_db print(SolModel2.objects.db) # 应该输出default print(User.objects.db)
额外注意点
- 确保
settings.py里的DATABASE_ROUTERS只配置了你的路由类,没有多余项:DATABASE_ROUTERS = ['sol_app.dbrouters.SolDataRouter'] - 模型的
Meta.db_table设置不影响路由逻辑,只要路由判断正确就没问题。
内容的提问来源于stack exchange,提问作者Alireza Jafari
相关产品推荐
相关产品推荐

