SQLite复合主键插入触发NOT NULL约束失败及异常求助
解决思路
1. 搞定NOT NULL constraint failed: contact.id问题
- 先查插入逻辑:复合主键里的每一列都不能为NULL,而SQLite只有单一
INTEGER PRIMARY KEY才会自动自增。你用复合主键的话,id不会自动生成值,要是插入时没给id传值,直接就触发这个错误。检查下你的插入语句,是不是漏传id字段了?比如之前单一主键时可以只传另外两个字段,复合主键下必须三个主键列都赋值。 - 要是想让
id自动生成:SQLite不支持复合主键里的自增列,得用触发器补这个逻辑。建表后加个触发器,插入时如果id为空就自动生成递增值:CREATE TRIGGER contact_id_autoinc BEFORE INSERT ON contact FOR EACH ROW WHEN NEW.id IS NULL BEGIN SELECT COALESCE(MAX(id), 0) + 1 INTO NEW.id FROM contact; END;
2. 修复AttributeError: 'SQLite_db'对象无rollback属性问题
- 你的
SQLite_db是自定义的封装类对吧?这个类里肯定没封装rollback方法,而sqlite3的原生连接对象是有rollback()的。要么给你的类加个方法:
要么在异常处理时直接调用类内部的连接对象的rollback,比如def rollback(self): self.conn.rollback()db.conn.rollback()(前提是你的类把conn属性暴露出来了)。
3. 可选的替代方案
- 要是复合主键不是必须的,可以保留单一自增
id作为主键,然后加个唯一约束来保证组合唯一性:
这样既保留了之前正常的插入逻辑,又能达到你要的组合唯一效果,省得折腾复合主键的问题。CREATE TABLE contact ( id INTEGER PRIMARY KEY AUTOINCREMENT, uniqueid TEXT, pb_id INTEGER, UNIQUE(uniqueid, pb_id) );
内容的提问来源于stack exchange,提问作者Hermann12
相关产品推荐
相关产品推荐

