【问题标题】:Create Table in transaction in SQLite in-memory database not being rolled back在 SQLite 内存数据库中的事务中创建表未回滚
【发布时间】:2023-04-04 05:20:01
【问题描述】:

内存中的 SQLite 是否支持围绕表创建的事务?我希望下面的代码开始事务,创建表,回滚事务,然后什么都没有。相反,桌子似乎仍然存在。

from sqlalchemy import create_engine, inspect

engine = create_engine('sqlite://', echo=True)
conn = engine.connect()

try:
    with conn.begin():
        conn.execute('''CREATE TABLE test (
            "index" BIGINT,
            a BIGINT,
            b BIGINT
        )''')
        assert False  # rollback
except AssertionError:
    pass

tables = inspect(engine).get_table_names()
assert tables == [], tables

断言失败:

Traceback (most recent call last):
    File "C:\...\lib\site-packages\IPython\core\interactiveshell.py", line 3418, in run_code
        exec(code_obj, self.user_global_ns, self.user_ns)
    File "<ipython-input-2-9e170787a857>", line 21, in <module>
        assert tables == [], tables
AssertionError: ['test']

这是引擎输出:

2021-03-01 12:16:16,872 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
2021-03-01 12:16:16,872 INFO sqlalchemy.engine.base.Engine ()
2021-03-01 12:16:16,872 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
2021-03-01 12:16:16,873 INFO sqlalchemy.engine.base.Engine ()
2021-03-01 12:16:16,873 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2021-03-01 12:16:16,873 INFO sqlalchemy.engine.base.Engine CREATE TABLE test (
    "index" BIGINT,
    a BIGINT,
    b BIGINT
)
2021-03-01 12:16:16,873 INFO sqlalchemy.engine.base.Engine ()
2021-03-01 12:16:16,874 INFO sqlalchemy.engine.base.Engine ROLLBACK
2021-03-01 12:16:16,874 INFO sqlalchemy.engine.base.Engine SELECT name FROM sqlite_master WHERE type='table' ORDER BY name
2021-03-01 12:16:16,874 INFO sqlalchemy.engine.base.Engine ()

编辑:SQLAlchemy 版本是1.3.23

【问题讨论】:

    标签: python sqlite sqlalchemy transactions


    【解决方案1】:

    pysqlite DBAPI 在事务处理方面存在几个已知问题,包括事务 DDL。它们在 SQLite 方言的 SQLAlchemy 文档中进行了讨论:

    Transactional DDL

    【讨论】:

    • 谢谢!我特别想link to their workaround 我验证修复了这个例子。请注意,语法在 1.13 和 1.14 之间略有变化。
    猜你喜欢
    • 2019-10-12
    • 2011-01-26
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    相关资源
    最近更新 更多