Django多库迁移celery任务库报错no such table: django_content_type
问题原因
从报错栈可以定位到问题根源:你使用的constance第三方包在迁移完成触发post_migrate信号时,强制在当前正在迁移的tasks库中查询/创建ContentType记录,但你的数据库路由禁止了contenttypes应用的表迁移到tasks库,因此触发表不存在的报错。
你的核心需求是tasks库仅存储Celery相关任务表,不需要Django内置的contenttypes、auth等额外表,可通过以下方案解决:
解决方案
方法1:禁用tasks库迁移时的post_migrate信号
执行tasks库迁移时追加--no-post-migrate参数,跳过所有post_migrate信号触发逻辑,即可避免constance的逻辑查询ContentType表,不会额外生成多余表,是成本最低的方案:
python manage.py migrate --database=tasks --no-post-migrate
方法2:调整数据库路由规则适配查询场景
如果不想每次执行迁移都加参数,可以修改路由的allow_migrate逻辑,针对信号触发的内置模型查询放行,同时保证不会在tasks库生成多余表:
def allow_migrate(self, db, app_label, model_name=None, **hints): print( f'allow migration database router invoked with args db={db},app_label={app_label},model_name={model_name},hints={hints}') if db == 'tasks': if model_name in self.tasks_models: print('returning True') return True # 仅放行内置模型的查询逻辑,不会实际创建这些表 if app_label in ['contenttypes', 'auth', 'constance']: print('returning None') return None print('returning False') return False print('returning None') return None
该配置不会在tasks库创建上述内置应用的表,仅允许查询逻辑自动回落到表实际所在的default库
方法3:独立配置Celery存储,脱离Django ORM管理
如果你仅需要用独立库存储Celery任务、结果数据,不需要把Celery表作为Django模型使用,可以直接配置Celery的独立数据库后端,不需要走Django迁移流程,Celery会自动管理自身的表:
在settings.py中添加配置即可:
# sqlite为例,可替换为MySQL/PostgreSQL等数据库的连接串 CELERY_RESULT_BACKEND = 'db+sqlite:///路径/tasks.sqlite3'
内容的提问来源于stack exchange,提问作者Ebrahim Karimi
相关产品推荐
相关产品推荐

