在python中没有commit命令的sqlite3保存更改

时间:2011-01-15 12:36:09

标签: python transactions sqlite autocommit

我读到某处将数据保存到python中的sqlite3数据库,你必须在连接对象上调用commit()函数。我从来没有这样做,但我的数据库仍然保存了数据......为什么?

5 个答案:

答案 0 :(得分:5)

使用适用于Python的sqlite3模块,autocommit is off by default(根据PEP 249的要求):

  

默认情况下,sqlite3模块在a之前隐式打开事务   数据修改语言(DML)声明(即   INSERT / UPDATE / DELETE / REPLACE),并隐式提交事务   在非DML,非查询语句之前(即除了之外的任何其他语句)   选择或上述)。

     

如果需要自动提交模式,请将isolation_level设置为None。

     

否则将其保留为默认值,这将导致普通   “BEGIN”语句,或将其设置为SQLite支持的隔离之一   级别:“DEFERRED”,“IMMEDIATE”或“EXCLUSIVE”。

您可以查看:

import sqlite3

# non-autocommit mode (default)
connection = sqlite3.connect("test.db")
cursor = connection.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS t (i INT)")
cursor.execute("INSERT INTO t VALUES (?)", (5,))
cursor.close()
connection.close()
connection = sqlite3.connect("test.db")
cursor = connection.cursor()
cursor.execute("SELECT * FROM t")
assert cursor.fetchall() == []
cursor.close()
connection.close()

# autocommit mode
connection = sqlite3.connect("test.db", isolation_level=None)
cursor = connection.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS t (i INT)")
cursor.execute("INSERT INTO t VALUES (?)", (5,))
cursor.close()
connection.close()
connection = sqlite3.connect("test.db", isolation_level=None)
cursor = connection.cursor()
cursor.execute("SELECT * FROM t")
assert cursor.fetchall() == [(5,)]
cursor.close()
connection.close()

注意。 - 使用内存中数据库(将":memory:"参数传递给函数sqlite3.connect),此测试将失败 on-disk 数据库,因为在连接关闭时释放了内存数据库。

答案 1 :(得分:4)

可能自动提交已启用,默认情况下为http://www.sqlite.org/c3ref/get_autocommit.html

答案 2 :(得分:3)

Python sqlite3在“INSERT”或“UPDATE”之前自动发出BEGIN语句。之后它会自动提交任何其他命令或db.close()

答案 3 :(得分:2)

添加isolation_level=None以连接(Ref

db = sqlite.connect(":memory:", isolation_level=None)

答案 4 :(得分:1)

连接对象也可以用作自动提交或回滚事务的上下文管理器。 11.13.7.3. on docs.python

# Successful, con.commit() is called automatically afterwards
with con:
    con.execute("insert into person(firstname) values (?)", ("Joe",))