sqlalchemy: как сделать немедленные транзакции sqlite? - PullRequest
0 голосов
/ 22 марта 2019

sqlite транзакций может быть "отложено", "немедленно" или "исключительно".По умолчанию используется значение «отложено», что означает, что транзакция не запускается до тех пор, пока она не станет абсолютно необходимой.Это может привести к прерыванию транзакции, если параллельные транзакции начинаются с чтения и переходят к записи.Подобных прерываний можно избежать, используя немедленные транзакции (за счет снижения производительности).

sqlalchemy аннотации sql диалектов, включая sqlite.У него также есть модель для записи транзакций:

with engine.begin() as connection:
    do_something_with_connection

Как сообщить sqlalchemy, что такая транзакция должна быть немедленной.В качестве альтернативы, как сообщить sqlalchemy, что все транзакции sqlite должны быть немедленными?

1 Ответ

1 голос
/ 28 марта 2019

Основные события 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...