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)
| 归档时间: |
|
| 查看次数: |
1274 次 |
| 最近记录: |