在未回滚的 SQLite 内存数据库中的事务中创建 Table
Create Table in transaction in SQLite in-memory database not being rolled back
内存中的 SQLite 是否支持围绕 table 创建的事务?我希望下面的代码开始事务,创建 table,回滚事务,然后什么都没有。相反,table 似乎仍然存在。
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
pysqlite DBAPI 有几个已知的事务处理问题,包括事务性 DDL。 SQLite 方言的 SQLAlchemy 文档中讨论了它们:
内存中的 SQLite 是否支持围绕 table 创建的事务?我希望下面的代码开始事务,创建 table,回滚事务,然后什么都没有。相反,table 似乎仍然存在。
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
pysqlite DBAPI 有几个已知的事务处理问题,包括事务性 DDL。 SQLite 方言的 SQLAlchemy 文档中讨论了它们: