SQLite 事务 可以是
DEFERRED
、IMMEDIATE
和 EXCLUSIVE
。默认值为 DEFERRED
,这意味着只有必要时才启动。如果并发事务从读取开始但继续写入,这可能会导致事务中止。可以通过使用 IMMEDIATE
来避免此类中止(以性能为代价)。
SQLAlchemy 抽象了 SQL 方言,包括 SQLite。它还有一个编写交易的模型:
with engine.begin() as connection:
do_something_with_connection
我如何告诉 SQLAlchemy 事务应该是
IMMEDIATE
?我如何告诉 SQLAlchemy 所有 SQLite 事务应该是 IMMEDIATE
?
核心事件https://docs.sqlalchemy.org/en/latest/core/events.html可用于拦截连接事件并重写事务开始时发出的BEGIN语句以达到你想要的目的。
有关更多详细信息,请参阅 sqlalchemy 文档中有关 sqlite 方言的部分 https://docs.sqlalchemy.org/en/latest/dialects/sqlite.html.
下面的示例代码是直接从文档中复制的,除了将 BEGIN 更改为 BEGIN IMMEDIATE 之外。
from sqlalchemy import create_engine, event
engine = create_engine("sqlite:///myfile.db")
@event.listens_for(engine, "connect")
def do_connect(dbapi_connection, connection_record):
# disable pysqlite's emitting of the BEGIN statement entirely.
# also stops it from emitting COMMIT before any DDL.
dbapi_connection.isolation_level = None
@event.listens_for(engine, "begin")
def do_begin(conn):
# emit our own BEGIN
conn.execute("BEGIN IMMEDIATE")