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

Django双应用分别绑定SQLite数据库时出现rc_db标签重复报错如何解决

问题解决步骤

第一步:修复应用标签重复报错

报错原因是INSTALLED_APPS中重复注册了同一应用:你同时写了rcdb和rc_db.apps.RcDbConfig两条配置,Django解析时会识别到重复的应用标签,直接删除rcdb这条配置即可解决该报错。
额外建议:模型类名遵守Django大驼峰命名规范,将rc_db模型类改名为RcDb,避免后续潜在的命名冲突。
修改后的INSTALLED_APPS示例:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'info',
    'notice.apps.NoticeConfig',
    'rc_db.apps.RcDbConfig',
]

第二步:配置多独立SQLite数据库

修改settings/base.py中的DATABASES配置,新增两个应用对应的独立数据库:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    # notice应用专属数据库
    'notice_db': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'notice.sqlite3',
    },
    # rc_db应用专属数据库
    'rc_db': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'rc_db.sqlite3',
    }
}

第三步:配置数据库路由

新建config/database_router.py文件,编写路由规则指定不同应用的模型操作对应数据库:

class AppDatabaseRouter:
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'notice':
            return 'notice_db'
        elif model._meta.app_label == 'rc_db':
            return 'rc_db'
        # Django内置应用走默认库
        return 'default'

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'notice':
            return 'notice_db'
        elif model._meta.app_label == 'rc_db':
            return 'rc_db'
        return 'default'

    def allow_relation(self, obj1, obj2, **hints):
        # 同库的模型允许关联查询
        if obj1._meta.app_label in ['notice', 'rc_db'] and obj1._meta.app_label == obj2._meta.app_label:
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'notice':
            return db == 'notice_db'
        elif app_label == 'rc_db':
            return db == 'rc_db'
        # 内置应用仅允许迁移到默认库
        return db == 'default'

在settings/base.py中添加路由配置激活规则:

DATABASE_ROUTERS = ['config.database_router.AppDatabaseRouter']

第四步:执行迁移

多数据库场景下需要分别指定数据库执行迁移命令:

  • 迁移默认库(存放Django内置应用数据):python manage.py migrate
  • 迁移notice应用数据库:python manage.py migrate --database=notice_db
  • 迁移rc_db应用数据库:python manage.py migrate --database=rc_db

内容的提问来源于stack exchange,提问作者ChanToRe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 16:54:02