Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么’;SQLite3是否需要一个commit()调用来用Python保存数据?_Python_Transactions_Sqlite_Autocommit - Fatal编程技术网

为什么’;SQLite3是否需要一个commit()调用来用Python保存数据?

为什么’;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数据库驱动程序在自动提交模式下运行 自动提交和

我在某处读到,为了用Python将数据保存到SQLite3数据库,应该调用connection对象的方法
commit
。但我从来没有必要这样做。为什么?

自动提交可能处于启用状态,默认情况下,连接对象也可以用作自动提交或回滚事务的上下文管理器


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

添加
isolation\u level=None
以连接()


这意味着您的SQLite3数据库驱动程序在自动提交模式下运行

自动提交和手动提交模式 A是一个回收单位。在事务中,所有SQL语句都在数据库事务中执行

  • 当SQL语句未包含在一对启动事务(
    BEGIN
    SAVEPOINT
    )和结束事务(
    COMMIT
    ROLLBACK
    RELEASE
    )SQL语句中时,它将在由SQL语句边界隐式分隔的数据库事务中执行。据说SQL语句处于自动提交模式,因为它的数据库事务是自动分隔的

  • 当SQL语句包含在一对开始事务(
    BEGIN
    SAVEPOINT
    )和结束事务(
    COMMIT
    ROLLBACK
    RELEASE
    )SQL语句中时,它将在由这对SQL语句明确分隔的数据库事务中执行。据说SQL语句处于手动提交模式,因为它的数据库事务是手动分隔的

换句话说,在数据库引擎级别,自动提交模式是默认模式

最佳做法是,因为通过将SQL语句显式分组到数据库事务中,可以避免数据损坏,因为恢复单元按预期进行了分隔

它们位于数据库引擎之上,因此可以将它们发送到底层数据库引擎的SQL语句进行转换。数据库驱动程序通常通过在任何连接和结束事务(
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
库在自动提交模式下运行,但Python
sqlite3
模块在默认情况下不运行

autocommit
模式意味着修改数据库的语句立即生效。
BEGIN
SAVEPOINT
语句禁用
autocommit
模式,结束最外层事务的
COMMIT
ROLLBACK
RELEASE
重新打开
autocommit
模式

Python
sqlite3
模块默认发出
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)