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
相关产品推荐
相关产品推荐

