причина для отката sqlalchemy

1

Я использую 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()

У кого-нибудь есть идея, что может быть причиной откатов?

Теги:
sqlalchemy

2 ответа

0
Лучший ответ

Хорошо, у меня нет клея на причине этой привычки, но в конце предложения решается проблема conn.execute("commit").

1

Не 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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню