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

执行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表名,和实际存在的表名不符,也会出现这个问题。

快速排查步骤

  1. 检查数据库中是否存在item_info表,表名是否和Django生成的一致(可以用python manage.py inspectdb查看实际表结构)。
  2. 确认item_info表的serial_num字段确实被设为主键,且类型为SQLite的INTEGER。
  3. 如果是手动建表,严格按照依赖顺序重新创建所有表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:51:53