为什么’;SQLite3是否需要一个commit()调用来用Python保存数据?
我在某处读到,为了用Python将数据保存到SQLite3数据库,应该调用connection对象的方法为什么’;SQLite3是否需要一个commit()调用来用Python保存数据?,python,transactions,sqlite,autocommit,Python,Transactions,Sqlite,Autocommit,我在某处读到,为了用Python将数据保存到SQLite3数据库,应该调用connection对象的方法commit。但我从来没有必要这样做。为什么?自动提交可能处于启用状态,默认情况下,连接对象也可以用作自动提交或回滚事务的上下文管理器 Python sqlite3在“插入”或“更新”之前自动发出BEGIN语句。之后,它会自动提交任何其他命令或db.close()添加isolation\u level=None以连接() 这意味着您的SQLite3数据库驱动程序在自动提交模式下运行 自动提交和
commit
。但我从来没有必要这样做。为什么?自动提交可能处于启用状态,默认情况下,连接对象也可以用作自动提交或回滚事务的上下文管理器
Python sqlite3在“插入”或“更新”之前自动发出BEGIN语句。之后,它会自动提交任何其他命令或db.close()添加
isolation\u level=None
以连接()
这意味着您的SQLite3数据库驱动程序在自动提交模式下运行 自动提交和手动提交模式 A是一个回收单位。在事务中,所有SQL语句都在数据库事务中执行
- 当SQL语句未包含在一对启动事务(
或BEGIN
)和结束事务(SAVEPOINT
、COMMIT
或ROLLBACK
)SQL语句中时,它将在由SQL语句边界隐式分隔的数据库事务中执行。据说SQL语句处于自动提交模式,因为它的数据库事务是自动分隔的RELEASE
- 当SQL语句包含在一对开始事务(
或BEGIN
)和结束事务(SAVEPOINT
、COMMIT
或ROLLBACK
)SQL语句中时,它将在由这对SQL语句明确分隔的数据库事务中执行。据说SQL语句处于手动提交模式,因为它的数据库事务是手动分隔的RELEASE
commit
或ROLLBACK
)SQL语句(即在数据库事务中尚未存在的任何SQL语句之前)之后向数据库引擎执行start transaction(BEGIN
)SQL语句来强制执行手动提交模式。这样,喜欢使用自动提交模式的用户必须明确地告诉数据库驱动程序
换句话说,在数据库驱动程序级别,手动提交模式通常是默认模式
SQLite数据库引擎
默认情况下,在自动提交模式下操作:
自动提交模式的测试
int-sqlite3\u-get\u-autocommit(sqlite3*)代码>
如果给定的数据库连接处于或不处于自动提交模式,则sqlite3\u get\u autocommit()
接口分别返回非零或零。默认情况下,自动提交模式处于启用状态。自动提交模式由BEGIN
语句禁用。自动提交模式通过提交
或回滚
重新启用
如果多语句事务中的语句出现某些类型的错误(错误包括SQLITE\u FULL
,SQLITE\u IOERR
,SQLITE\u NOMEM
,SQLITE\u BUSY
,以及SQLITE\u INTERRUPT
),则事务可能会自动回滚。确定SQLite是否在发生错误后自动回滚事务的唯一方法是使用此函数
如果另一个线程在该例程运行时更改数据库连接的自动提交状态,则返回值未定义
另请参见对象、常量和函数的列表
SQLite3数据库驱动程序
要求Python数据库驱动程序默认以手动提交模式运行:
.commit()
将任何挂起的事务提交到数据库
请注意,如果数据库支持自动提交功能,则必须
一开始就要离开。可以提供一个接口方法将其返回
开
不支持事务的数据库模块应实现
此方法具有void功能
因此,默认情况下,在手动提交模式下操作:
控制交易
默认情况下,底层的sqlite3
库在自动提交模式下运行,但Pythonsqlite3
模块在默认情况下不运行
autocommit
模式意味着修改数据库的语句立即生效。BEGIN
或SAVEPOINT
语句禁用autocommit
模式,结束最外层事务的COMMIT
、ROLLBACK
或RELEASE
重新打开autocommit
模式
Pythonsqlite3
模块默认发出BEGIN
语句
在数据修改语言(DML)语句(即。
插入
/更新
/删除
/替换
)
您可以通过调用connect()
的isolation\u level
参数来控制隐式执行哪类BEGIN
语句sqlite3
,或者
通过连接的隔离级别
属性。如果指定“否”
隔离级别
,使用普通的开始
,相当于
指定延迟的
。其他可能的值包括立即
和
独家
通过将isolation\u level
设置为None
,可以禁用sqlite3
模块的隐式事务管理。这将使基础的sqlite3
库在autocommit
模式下运行。然后,您可以通过显式地发出<
# Successful, con.commit() is called automatically afterwards
with con:
con.execute("insert into person(firstname) values (?)", ("Joe",))
db = sqlite.connect(":memory:", isolation_level=None)