Python SQLite3 插入数据后查询无返回、读库为空却报唯一约束冲突
核心问题定位
实际你插入的数据已经成功写入数据库文件,所有异常表现都是操作逻辑和工具使用方式错误导致的误判,具体对应三点问题:
- 查询逻辑存在关键错误:执行完INSERT语句并提交事务后,没有先执行SELECT查询语句就直接调用
c.fetchall()。这个方法只会返回当前游标最后一次执行的SQL对应的结果集,INSERT操作本身不会返回查询结果集,自然拿到空列表,和数据是否成功存储没有关系。 - 主键冲突报错是数据已写入的直接证明:如果插入的ID=6的记录真的没有存进数据库,重复执行相同插入语句根本不会触发"唯一约束失败"的主键冲突错误。
- 打开数据库文件看到乱码是工具兼容性问题:SQLite是二进制格式的数据库文件,Google Sheets、普通文本类工具无法直接解析二进制结构,打开后读取到的零散空白、分号、乱码都是二进制文件被强制按文本解码后的显示效果,不代表实际存储内容为空。
修正后的可运行代码
import sqlite3 # 连接指定数据库文件,文件不存在则自动创建 conn = sqlite3.connect('login.db') c = conn.cursor() # 建表语句加存在判断,避免重复运行时报表已存在错误 c.execute("""CREATE TABLE IF NOT EXISTS Login ( ID INTEGER PRIMARY KEY, First TEXT NOT NULL, Last TEXT NOT NULL, Middle TEXT NOT NULL, Gender TEXT NOT NULL );""") conn.commit() # 插入测试记录 c.execute("""INSERT INTO Login VALUES (6, 'First', 'Last', 'Hello', 'Male');""") conn.commit() # 核心修正:先执行查询SQL,再调用fetchall获取结果 c.execute("SELECT * FROM Login;") print(c.fetchall()) c.close() conn.close()
日常使用注意事项
- 查看SQLite数据库内容时,需要使用专门适配SQLite格式的可视化工具,不要直接用Google Sheets、记事本这类不支持二进制解析的工具打开.db文件,否则看到的乱码不具备参考性。
- SQLite的事务机制中,只要执行了
conn.commit(),所有之前执行的增删改操作都会永久写入磁盘文件,不存在提交后数据丢失的情况。
内容的提问来源于stack exchange,提问作者Python Programmer
相关产品推荐
相关产品推荐

