
sqlite 数据库中插入的数据必须显式调用 con.commit() 才能持久化到磁盘;否则事务回滚,其他文件无法读取已写入的数据。
sqlite 数据库中插入的数据必须显式调用 con.commit() 才能持久化到磁盘;否则事务回滚,其他文件无法读取已写入的数据。
在 Python 中使用 sqlite3 模块操作 SQLite 数据库时,所有写操作(如 INSERT、UPDATE、DELETE)默认运行在事务中,而 SQLite 的默认行为是:不执行 commit() 就关闭连接,修改将被自动回滚——这正是你遇到“数据在写入脚本中可见、但在另一脚本中为空”的根本原因。
✅ 正确做法:显式提交事务
在插入数据后、关闭连接前,必须调用 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() # 可选,但推荐显式关闭
⚠️ 注意:仅 con.close() 不足以保存数据;commit() 必须在 close() 之前调用。
? 验证跨文件访问(读取端)
确保数据库路径一致(建议使用绝对路径或统一工作目录),读取脚本无需额外操作:
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: {len(records)}")
for row in records:
print(f"Id: {row[0]}, Name: {row[1]}, Licence Plate: {row[2]}, Parking Spot: {row[3]}")
con.close()
? 最佳实践建议
- 始终配对使用 commit() + close():写操作后务必 commit(),再 close();
-
使用上下文管理器(推荐):自动 commit(仅限 INSERT/UPDATE/DELETE 等写操作需显式 commit,但 with 可确保连接安全关闭):
with sql.connect("db_Persons.db") as con: cur = con.cursor() cur.execute("INSERT INTO Persons (...) VALUES (...)") con.commit() # 仍需手动 commit —— 上下文管理器不会自动 commit 写操作! - 避免隐式事务陷阱:SQLite 默认 isolation_level=None(即 autocommit 模式关闭),因此所有 DML 均需手动 commit;
- 检查数据库文件位置:确认两个脚本运行时工作目录相同,或使用 os.path.abspath("db_Persons.db") 统一路径。
只要补上 con.commit(),数据库文件即被真实写入磁盘,后续任意 Python 进程均可可靠读取——这是 SQLite 跨文件共享数据的基础保障。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











