重写Django模型移除冗余主键后出现InvalidCursorName错误如何修复
问题成因
报错的根本原因是数据库表结构和Django模型定义不匹配:
你删除本地迁移文件的操作仅清理了本地的迁移记录,既没有修改数据库中已存在的旧表结构,也没有删除Django内置django_migrations表中存储的历史迁移执行记录。你修改模型移除硬编码主键后,新生成的迁移逻辑和数据库里的旧表结构无法对应:Django默认会找模型的id字段作为主键查询,但Nome_Popular对应的旧数据库表的主键还是你之前硬编码的其他字段,所以触发column app_species_catalog_nome_popular.id does not exist报错,后续的游标不存在报错是该异常触发的连锁反应。
另外注意你当前贴出的Arvore模型中,nome_cientifico字段仍然保留了primary_key=True的硬编码主键设置,如果确实要统一移除自定义主键需要同步修改。
解决步骤
操作前先完整备份你的PostgreSQL数据库,避免数据丢失:
- 清理本地迁移文件:删除你应用下
migrations文件夹中除__init__.py之外的所有文件 - 清理数据库中的迁移记录:连接到PostgreSQL数据库,执行SQL语句删除对应应用的历史迁移记录
DELETE FROM django_migrations WHERE app = '你的应用名称';
将语句中的你的应用名称替换为你自己的应用名,参考报错前缀应为species_catalog
- 清理数据库中的旧表:执行SQL删除该应用对应的所有旧表,级联删除会同步清理关联的约束、中间表
DROP TABLE IF EXISTS app_species_catalog_nome_popular CASCADE; DROP TABLE IF EXISTS app_species_catalog_arvore CASCADE; DROP TABLE IF EXISTS app_species_catalog_img_arvore CASCADE; -- 其他该应用的模型对应的表也按上述格式一并删除
- 检查所有模型定义:确认包括
Nome_Popular、Taxonomia、Biotipo等在内的所有关联模型,要么明确设置了主键字段,要么没有自定义主键由Django自动生成id主键 - 重新生成并执行迁移:
python manage.py makemigrations 你的应用名称 python manage.py migrate
操作完成后再进入Django admin后台测试添加数据即可恢复正常。
内容的提问来源于stack exchange,提问作者Fernando Soares
相关产品推荐
相关产品推荐

