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

Django生产服务器迁移报错:relation authentication_cityhaldata不存在

Django生产环境迁移报错:relation "authentication_cityhaldata" does not exist 解决方法

问题分析

报错提示authentication_cityhaldata表不存在,且常规迁移文件重建操作无效,核心原因通常是数据库迁移记录(django_migrations表)与实际模型/表结构不匹配,或模型中存在触发提前查询的逻辑干扰迁移执行。

具体解决步骤

1. 确认数据库与迁移记录的状态

连接生产数据库,执行以下SQL检查核心状态:

-- 检查目标表是否存在
SELECT * FROM authentication_cityhaldata;
-- 检查authentication应用的迁移记录
SELECT * FROM django_migrations WHERE app='authentication';

根据结果分情况处理:

  • 如果表不存在,但django_migrations里有创建该表的迁移记录:删除这条错误记录(替换xxxx为对应迁移文件名):
    DELETE FROM django_migrations WHERE app='authentication' AND name='xxxx';
    
  • 如果表存在,但django_migrations里无对应迁移记录:执行python manage.py migrate --fake authentication标记该应用迁移已完成(仅当表结构与模型完全一致时使用)。

2. 修复模型中干扰迁移的逻辑

观察CityHalData的save方法,先save再通过ORM更新的写法,在迁移创建表阶段可能触发对未完全创建的表的查询,导致报错。建议修改为:

def save(self, *args, **kwargs):
    super().save(*args, **kwargs)
    if not self.slug:
        self.slug = slugify(f"{self.name}-id-{self.pk}")
        # 仅更新slug字段,避免循环调用
        super().save(*args, **kwargs, update_fields=['slug'])

3. 重新生成并执行迁移(生产环境务必先备份数据库)

  • 保留authentication/migrations和项目根目录migrations下的__init__.py,删除其他所有迁移文件。
  • 在本地开发环境(确保模型与数据库完全同步)执行:
    python manage.py makemigrations authentication
    
    将生成的迁移文件上传至生产服务器对应目录。
  • 在生产服务器执行:
    # 尝试标记初始迁移已完成(适用于表已存在的情况)
    python manage.py migrate authentication --fake-initial
    # 若上述命令无效,从头重建迁移(会删除表,需提前备份数据)
    python manage.py migrate --fake authentication zero
    python manage.py migrate authentication
    

4. 其他排查项

  • 确认生产与本地的Django版本完全一致,版本差异可能导致迁移逻辑冲突。
  • 检查settings.py的INSTALLED_APPS中是否包含authentication应用,且顺序正确。
  • 验证生产数据库配置(DATABASES)是否指向目标库,权限是否足够。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:35:56