Python SQLite3:cursor与connection执行UPDATE语句的差异问题
嘿,我来帮你捋捋这个问题!你遇到的con.execute()能成功写入但c.execute()不行的情况,大概率是事务提交机制在搞鬼,咱们一步步拆解清楚:
问题根源
在Python操作数据库的逻辑里:
- 连接对象(
con)的execute方法,部分数据库驱动(比如SQLite)会隐式帮你完成事务提交; - 而游标对象(
c)执行SQL后,默认不会自动提交事务——数据库会把你的修改暂存起来,直到你手动触发提交,才会真正写入磁盘。
这就是为什么两种执行方式会有差异的核心原因。
快速修复方案
如果你想用游标c.execute()成功完成写入,只需要补上事务提交的步骤就行,给你两种常见的处理方式:
方式1:手动提交事务
执行完SQL后,调用连接对象的commit()方法:
# 假设你的原有代码框架 import sqlite3 con = sqlite3.connect("your_db.db") c = con.cursor() # 执行UPDATE语句 c.execute("UPDATE your_table SET column = 'new_value' WHERE id = 1") # 关键:手动提交事务! con.commit() # 用完记得关闭资源 c.close() con.close()
方式2:开启自动提交
如果希望每次游标执行后自动提交,可以在创建连接时开启自动提交模式(不同数据库的设置方式略有区别):
# SQLite的自动提交设置(isolation_level设为None) con = sqlite3.connect("your_db.db", isolation_level=None) c = con.cursor() # 此时执行UPDATE后无需手动commit c.execute("UPDATE your_table SET column = 'new_value' WHERE id = 1")
额外注意事项
- 如果执行过程中出现错误,记得用
con.rollback()回滚事务,避免留下脏数据; - 不是所有数据库的连接对象
execute都会自动提交,比如MySQL默认就不会,所以养成手动提交的习惯更稳妥。
内容的提问来源于stack exchange,提问作者csf
相关产品推荐
相关产品推荐

