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

jam*_*mes 7 python sqlite transactions autocommit

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

Mag*_*ero 7

使用BEGINPython模块,默认情况下自动提交是关闭(根据PEP 249的要求):

默认情况下,sqlite3模块在数据修改语言(DML)语句(即INSERT/UPDATE/DELETE/REPLACE)之前隐式打开事务,并在非DML非查询语句(即SELECT或其他任何语句)之前隐式提交事务.之前所提).

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

否则将其保留为默认值,这将产生一个简单的"BEGIN"语句,或将其设置为SQLite支持的隔离级别之一:"DEFERRED","IMMEDIATE"或"EXCLUSIVE".

你可以检查:

int sqlite3_get_autocommit(sqlite3*);
Run Code Online (Sandbox Code Playgroud)

注意.- 使用内存数据库(INSERT传递给函数的参数UPDATE)而不是磁盘数据库,此测试将失败,因为在关闭连接时将释放内存数据库.


Nav*_*avi 4

可能自动提交已打开,默认情况下是http://www.sqlite.org/c3ref/get_autocommit.html

  • 奇怪的是,在这个 Python *standard lib* 模块中默认启用自动提交,而 Python DB API 规范 https://www.python.org/dev/peps/pep-0249/ 命令:“*Note如果数据库支持自动提交功能,则必须首先关闭该功能。可以提供接口方法将其重新打开。*”:-) (2认同)
  • 不完全是。默认情况下,[自动提交在 SQLite C 库中是*打开*](http://www.sqlite.org/c3ref/get_autocommit.html),但它是[*在 SQLite 3 Python 库中*关闭*]( https://docs.python.org/3.7/library/sqlite3.html#controlling-transactions)。 (2认同)