автоматическая фиксация с помощью панд to_sql с использованием sqlalchemy с sqlite - PullRequest
0 голосов
/ 29 сентября 2019

В случае sqlite неясно, можем ли мы легко выполнить фиксацию сразу после каждой вставки информационного кадра. (Предполагая, что автоматическая фиксация по умолчанию отключена, в соответствии с соглашением о переносе базы данных python).

Использование простейшего потока API sqlalchemy -

db_engine = db.create_engine()
for .....
   # slowly compute some_df, takes a lot of time
   some_df.to_sql(con = db_engine)

Как мы можем убедиться, что каждый .to_sql совершено?

Для мотивации представьте, что конкретный вариант использования состоит в том, что каждая запись отражает результат потенциально очень длинных вычислений, и мы не хотим терять ни огромную партию таких вычислений, ни одну из них. В случае, если машина выходит из строя или в случае, если объект механизма python sqlalchemy подвергается сборке мусора до того, как все его записи будут фактически стерты в базе данных.

Я считаю, что автоматическая фиксация по умолчанию отключена, и для sqlite нет способа изменить это в команде create_engine. Какой может быть самый простой и безопасный способ добавления поведения автоматической фиксации - или явной фиксации после каждой записи в информационный кадр - при использовании упрощенного .to_sql api?

Или код должен быть реорганизован для использования другого потока APIчтобы сделать это?

Ответы [ 2 ]

1 голос
/ 29 сентября 2019

С https://docs.sqlalchemy.org/en/13/core/connections.html#understanding-autocommit:

Функция «автоматической фиксации» действует только тогда, когда Transaction не было объявлено иначе. Это означает, что эта функция обычно не используется с ORM, поскольку объект Session по умолчанию всегда поддерживает текущий Transaction.

. В вашем коде вы не представили никаких явных транзакций, и поэтому механизм , используемый в качестве con, находится в режиме автоматической фиксации (как реализовано в SQLA).

Обратите внимание, что SQLAlchemy реализует свою собственную автоматическую фиксацию, которая не зависит от возможной автоматической фиксации драйвера DB-API /нетранзакционные функции.

Следовательно, «1018 * простейший , самый безопасный способ добавления поведения автоматической фиксации - или явной фиксации после каждой записи в информационный кадр» - это то, что вы уже имели, если только to_sql()выдает некоторые забавные утверждения, которые SQLA не распознает как операции изменения данных, чего у него нет, по крайней мере в последнее время.

Возможно, функция автоматического подтверждения SQLA выйдет из следующего основного выпуска, нонам придется подождать и посмотреть.

1 голос
/ 29 сентября 2019

Вы можете установить соединение для автоматической фиксации:

db_engine = db_engine.execution_options(autocommit=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...