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

SQLite FOREIGN KEY constraint failed报错排查求助

问题排查与解决方案

核心问题分析

1. 外键约束顺序错误

你在插入video_comment时使用video_id=1,但对应的video表记录是在循环结束后才插入的。此时video表中还没有id=1的记录,违反了video_comment.video_id REFERENCES video(id)的外键约束,这是报错的直接原因。

2. SQLite参数绑定错误

db.execute()的第二个参数需要是元组,你直接传递多个独立参数会导致参数绑定异常,虽然插入comments时看似成功,但实际存在隐藏风险。

3. 评论ID获取方式不可靠

通过comment文本查询id存在重复风险——如果有相同内容的评论,会返回错误的ID。正确做法是直接获取刚插入记录的自增ID。

修正后的代码

# 先插入video记录,确保video表存在id=1的记录
db.execute("INSERT INTO video (user_id, video_id, data, url) VALUES (?, ?, ?, ?)", (1, 1, current_time, url))

for elemen in comments:
    print(elemen.text)
    # 参数改为元组形式,插入评论并获取游标
    cursor = db.execute("INSERT INTO comments (user_id, comment, data, url) VALUES (?, ?, ?, ?)", 
                       (1, elemen.text, current_time, url))
    # 通过lastrowid获取刚插入的评论ID,避免重复内容导致的错误
    comment_id = cursor.lastrowid
    print(comment_id)
    
    # 插入关联表,参数同样用元组
    db.execute("INSERT INTO video_comment (video_id, comment_id) VALUES (?, ?)", (1, comment_id))

# 提交事务,确保所有操作持久化
db.commit()

额外注意事项

  • 强制开启外键约束:连接数据库后执行db.execute("PRAGMA foreign_keys = ON"),确保SQLite严格检查外键规则,更早发现问题。
  • 务必提交事务:所有数据库修改操作后必须调用db.commit(),否则插入的记录不会保存到磁盘。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:32:53