
SQLite 数据库中插入的数据必须显式调用 con.commit() 才能持久化,否则事务回滚导致其他文件无法读取——这是跨文件访问数据失败的最常见原因。
sqlite 数据库中插入的数据必须显式调用 `con.commit()` 才能持久化,否则事务回滚导致其他文件无法读取——这是跨文件访问数据失败的最常见原因。
在 Python 中使用 sqlite3 模块操作 SQLite 数据库时,写入操作(如 INSERT、UPDATE、DELETE)默认在事务中执行,且不会自动提交。若未手动调用 commit(),即使 execute() 成功执行、fetchall() 在当前脚本中能查到数据,这些更改也仅存在于内存事务中,程序退出或连接关闭时将被自动回滚——这正是你在第二份脚本中看到“表为空”的根本原因。
✅ 正确做法:在插入数据后、关闭连接前,必须显式调用 con.commit()。以下是修正后的数据写入脚本:
import sqlite3 as sql
con = sql.connect("db_Persons.db")
cur = con.cursor()
def setData():
cur.execute("""
INSERT INTO Persons (Name, NumberPlate, Parking)
VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?), (?, ?, ?)
""", (
'Alfred', 'DK12345', 0,
'Bent', 'DK45932', 0,
'Charlotte', 'DK84975', 0,
'Dorte', 'DK98347', 0
))
setData()
con.commit() # ✅ 关键:持久化变更
con.close() # 推荐在 commit 后关闭连接
⚠️ 注意事项:
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 避免使用字符串拼接 SQL(如原代码中的 'Alfred' 直接嵌入),应始终使用参数化查询(? 占位符),防止 SQL 注入;
- commit() 必须在 con.close() 之前调用,否则更改丢失;
- 若使用 with 语句管理连接(推荐),可自动提交(需设置 isolation_level=None)或手动提交,但显式 commit() 更清晰可控;
- 确保所有脚本使用完全相同的数据库文件路径(如 "db_Persons.db"),相对路径需注意工作目录一致性。
完成上述修正后,你的读取脚本即可正常访问数据:
import sqlite3 as sql
con = sql.connect("db_Persons.db")
cur = con.cursor()
records = cur.execute("SELECT * FROM Persons").fetchall()
print(f"Total rows: {len(records)}")
for row in records:
print(f"Id: {row[0]}, Name: {row[1]}, Licence Plate: {row[2]}, Parking Spot: {row[3]}")
con.close()
? 总结:SQLite 的 ACID 特性要求开发者主动管理事务边界。commit() 不是可选项,而是数据持久化的必要步骤——跨文件共享数据的前提,是数据真正写入磁盘文件。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










