
SQLite 数据库在 Python 中跨文件访问失败,通常是因为未提交事务;本文详解如何通过 commit() 持久化数据,并确保多文件间可靠读写。
sqlite 数据库在 python 中跨文件访问失败,通常是因为未提交事务;本文详解如何通过 `commit()` 持久化数据,并确保多文件间可靠读写。
在 Python 中使用 SQLite 时,一个常见误区是:执行 INSERT 等写操作后未显式调用 con.commit()。SQLite 默认启用事务机制——每次写操作(如 INSERT、UPDATE、DELETE)都会自动开启一个新事务,但除非显式提交,否则更改仅存在于内存中,程序退出或连接关闭时将被回滚,数据不会写入磁盘文件。这正是你在第二份脚本中查不到数据的根本原因:第一份插入数据的脚本运行完毕后未提交,数据库文件实际仍为空。
✅ 正确做法:务必显式提交事务
修改你的数据插入脚本,在 setData() 调用后添加 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() # ? 推荐:显式关闭连接⚠️ 注意事项:
提示词大师-python版下载图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- commit() 必须在 con.close() 之前调用,否则提交无效;
- 若使用 with 语句管理连接(推荐),可自动提交(需配合 isolation_level=None 或手动 commit),但显式调用 commit() 更清晰可控;
- 创建表的操作(CREATE TABLE)也属于 DDL,虽部分 SQLite 版本会自动提交,但为一致性起见,建议对所有写操作统一处理。
✅ 验证与跨文件访问
完成上述修改并运行插入脚本后,数据库文件 db_Persons.db 将真实包含数据。此时,你原来的查询脚本即可正常工作:
立即学习“Python免费学习笔记(深入)”;
import sqlite3 as sql
con = sql.connect("db_Persons.db")
cur = con.cursor()
cur.execute("SELECT * FROM Persons")
records = cur.fetchall()
print(f"Total rows are: {len(records)}")
print("Printing each row:")
for row in records:
print(f"Id: {row[0]}, Name: {row[1]}, Licence Plate: {row[2]}, Parking Spot: {row[3]}")
con.close()✅ 最佳实践建议
- 统一路径管理:确保所有脚本访问的是同一数据库文件路径(建议使用绝对路径或 os.path.join() 构建);
- 错误处理增强:生产环境中应包裹 try...except,并在异常时调用 con.rollback();
-
使用上下文管理器(推荐):
with sql.connect("db_Persons.db") as con: cur = con.cursor() cur.execute("INSERT INTO ...", values) con.commit() # 显式 commit 依然必要 # 连接自动关闭,且若未 commit 则自动 rollback
只要确保写操作后调用 con.commit(),SQLite 数据库就能在多个 Python 文件间稳定、可靠地共享数据。


















