sqlalchemy:如何使 sqlite 事务立即进行?

Hel*_*hne 5 sqlite sqlalchemy

sqlite 事务可以是“延迟”、“立即”或“独占”。默认值为“延迟”,这意味着除非绝对必要,否则不会启动事务。如果并发事务从读取开始然后继续写入,这可能会导致事务中止。可以通过使用立即事务来避免此类中止(以降低性能为代价)。

sqlalchemy 抽象了包括 sqlite 在内的 sql 方言。它还有一个编写交易的模型:

with engine.begin() as connection:
    do_something_with_connection
Run Code Online (Sandbox Code Playgroud)

如何告诉 sqlalchemy 这样的事务应该立即进行。或者,如何告诉 sqlalchemy 所有 sqlite 事务都应该是立即的?

小智 4

核心事件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")
Run Code Online (Sandbox Code Playgroud)