You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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把所有迁移应用到所有数据库,这就是你之前的问题根源。正确步骤:

  1. 生成所有应用的迁移文件:
    python manage.py makemigrations
    
  2. 给default数据库执行迁移(仅处理非sol_app的模型):
    python manage.py migrate --database=default
    
  3. 给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 07:58:10