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

问题描述 投票:0回答:1

sqlite transactions猫是“延期”,“立即”或“独家”。默认为“延期”,这意味着,在绝对必要之前不会启动交易。如果并发事务以读取开始并继续写入,则可能导致事务中止。通过使用即时交易(以降低性能为代价)可以避免这种中止。

sqlalchemy摘要sql方言,包括sqlite。它还有一个用于编写事务的模型:

with engine.begin() as connection:
    do_something_with_connection

如何告诉sqlalchemy这样的交易应该立竿见影。或者,如何告诉sqlalchemy所有sqlite事务应该是立即的?

sqlite sqlalchemy
1个回答
1
投票

核心事件https://docs.sqlalchemy.org/en/latest/core/events.html可用于拦截连接事件并重写在事务开始时发出的BEGIN语句,以实现您想要的。有关详细信息,请参阅sqlite方言的sqlalchemy文档部分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")
© www.soinside.com 2019 - 2024. All rights reserved.