Я использую sqlalchemy для хранения данных в базе данных postgresql. Я немного смущен тем, что sqlalchemy откатывается от выполнения, не вызывая исключения. Я нашел статью в документальном фильме и попытался предотвратить откаты, установив pool_reset_on_return='commit'
Это фактически приводит к тому, что sqlalchemy ничего не делает. Следовательно, я вставил строку, которая явно вызывает trans.commit()
которая приводит к следующему выводу:
2014-03-03 18:03:33,390,p:32764 Thread-3, sqlalchemy.engine.base.Engine(_execute_context) [INFO]: INSERT INTO _fd (**)
2014-03-03 18:03:33,391,p:32764 Thread-3, sqlalchemy.engine.base.Engine(_execute_context) [INFO]: {****}
2014-03-03 18:03:33,392,p:32764 Thread-3, sqlalchemy.engine.base.Engine(__init__) [DEBUG]: Col ('fid',)
2014-03-03 18:03:33,393,p:32764 Thread-3, sqlalchemy.engine.base.Engine(process_rows) [DEBUG]: Row (*,)
2014-03-03 18:03:33,393,p:32764 Thread-3, sqlalchemy.engine.base.Engine(_rollback_impl) [INFO]: ROLLBACK
Код до сих пор прост:
1837 with conn.begin() as trans:
1838 statement = meta.tables[_table_name].insert().values(
...
1847 )
1848 res = conn.execute(statement)
1849 trans.commit()
У кого-нибудь есть идея, что может быть причиной откатов?
Хорошо, у меня нет клея на причине этой привычки, но в конце предложения решается проблема conn.execute("commit")
.
Не 100% уверены в причине, но, глядя на источник, мы можем видеть, что когда вы делаете trans.commit()
в своей структуре with....
, он устанавливает транзакцию в неактивную. Теперь, когда Context Manager
по сделке пытается запустить __exit__()
метод в конце with
утверждением, что вызывает rollback()
, потому что is_active
флаг был установлен в значение False. (Я не знаю, что происходит, когда вы совершаете транзакцию, а затем откатываете ее обратно).
В любом случае "проблема" заключается в том, что with
конструкцией обрабатывает часть фиксации и отката неявно. В документах все, что вам нужно сделать, это
with conn.begin() as trans:
statement = meta.tables[_table_name].insert().values(
...
)
res = conn.execute(statement)