执行Django模型脚本时出现SQLite foreign key mismatch错误的原因咨询
解决SQLite外键不匹配错误:"foreign key mismatch - 'pur_history' referencing 'item_info'"
碰到这个错误别慌,我结合你贴的Django模型代码,拆解一下大概率的原因和排查方向:
最常见的诱因:表的创建顺序错误
SQLite在创建带外键关联的表时,必须保证被引用的表已经存在。你的pur_history模型通过OneToOneField关联了item_info,如果创建数据库表的顺序搞反了——先建pur_history再建item_info,SQLite找不到被引用的目标表,就会直接抛出这个外键不匹配的错误。
正常来说Django的migrations会自动处理表的依赖顺序,但如果你是跳过migrations手动执行脚本建表,一定要严格按依赖链顺序来:
- 先创建
item_sort_info(items依赖它) - 再创建
items(item_info依赖它) - 接着创建
item_info(pur_history依赖它) - 最后创建
pur_history(还要注意你代码里的customer_info也得提前创建,因为pur_history也依赖这个表)
其他可能的原因
- 字段类型不匹配:虽然你的
item_info主键serial_num是PositiveIntegerField,Django理论上会自动让pur_history的外键字段匹配类型,但如果手动修改过字段定义,或者出现了字段映射异常(比如把整数类型映射成了SQLite的非整数类型),也会触发错误。 - 主键约束未生效:SQLite要求外键必须引用被引用表的主键或带唯一约束的字段。你的
item_info已经把serial_num设为主键了,但如果建表时主键约束没生效(比如手动建表时漏写了PRIMARY KEY),也会导致外键匹配失败。 - 表名不匹配:Django默认会给表名加上应用前缀(比如应用叫
store,item_info对应的表名是store_item_info),如果pur_history的外键错误引用了不带前缀的item_info表名,和实际存在的表名不符,也会出现这个问题。
快速排查步骤
- 检查数据库中是否存在
item_info表,表名是否和Django生成的一致(可以用python manage.py inspectdb查看实际表结构)。 - 确认
item_info表的serial_num字段确实被设为主键,且类型为SQLite的INTEGER。 - 如果是手动建表,严格按照依赖顺序重新创建所有表。
内容的提问来源于stack exchange,提问作者KangBada
相关产品推荐
相关产品推荐

