You need to enable JavaScript to run this app. Python SQLite3 插入数据后查询无返回、读库为空却报唯一约束冲突
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 02:15:10