sqlite transactions猫是“延期”,“立即”或“独家”。默认为“延期”,这意味着,在绝对必要之前不会启动交易。如果并发事务以读取开始并继续写入,则可能导致事务中止。通过使用即时交易(以降低性能为代价)可以避免这种中止。
sqlalchemy摘要sql方言,包括sqlite。它还有一个用于编写事务的模型:
with engine.begin() as connection:
do_something_with_connection
如何告诉sqlalchemy这样的交易应该立竿见影。或者,如何告诉sqlalchemy所有sqlite事务应该是立即的?
核心事件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")