【问题标题】:Problems with autocommit in sqlite3 module from Python3Python3 的 sqlite3 模块中的自动提交问题
【发布时间】:2017-11-10 14:58:29
【问题描述】:

在给定的数据库连接中关闭自动提交模式时遇到问题。根据我从 sqlite3 模块文档中了解到的情况,下面的 python 代码不应该引发任何 AssertionError 异常,但确实如此。

表“nomes”已存在于数据库中并包含列“Nome”

import sqlite3

_PATH_DB = '/rhome/FNORO/tabelao/sofia.sqlite' # path to database
_ISOLATION_LEVEL = "EXCLUSIVE"
_TEST_NAME = "TEST1"

# delete name from database
with sqlite3.connect(_PATH_DB, isolation_level = _ISOLATION_LEVEL) as conn:
    query = 'DELETE FROM nomes WHERE nome = "{}"'.format(_TEST_NAME)
    conn.execute(query)
    conn.commit()

# insert name _TEST_NAME without executing conn.commit()
with sqlite3.connect(_PATH_DB, isolation_level = _ISOLATION_LEVEL) as conn:
    query = 'INSERT INTO nomes(nome) VALUES("{}")'.format(_TEST_NAME)
    conn.execute(query)

# check if name already existis
with sqlite3.connect(_PATH_DB, isolation_level = _ISOLATION_LEVEL) as conn:
    query = 'SELECT nome FROM nomes WHERE nome = "{}"'.format(_TEST_NAME)
    res = conn.execute(query).fetchall()
    assert (res == [])

Sqlite3 文档在这里:https://docs.python.org/2/library/sqlite3.html#connection-objects

isolation_level

获取或设置当前的隔离级别。对于自动提交模式或“DEFERRED”、“IMMEDIATE”或“EXCLUSIVE”之一,无。有关更详细的说明,请参阅控制事务部分。

我在这里错过了什么?

【问题讨论】:

    标签: python python-3.x sqlite autocommit


    【解决方案1】:

    独立于您使用的isolation_level,使用with 语句意味着在with 块结束后将自动处理所有内容。

    这意味着提交任何剩余的未结交易。

    看看这个文档: https://docs.python.org/2/library/sqlite3.html#using-the-connection-as-a-context-manager

    连接对象可以用作上下文管理器,自动 提交或回滚事务。发生异常时, 事务回滚;否则,事务被提交:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 2012-09-13
      • 2012-11-18
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多