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