Сделайте SQLAlchemy COMMIT вместо ROLLBACK после запроса SELECT - PullRequest
4 голосов
/ 26 сентября 2011

Я разрабатываю приложение вместе с партнером.Я делаю часть базы данных ( PostgreSQL ), мой партнер реализует приложение на веб-сервере с помощью Python, используя SQLAlchemy .Мы интенсивно используем хранимые процедуры.Запрос SELECT для одного из них в журнале базы данных выглядит следующим образом:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SELECT col_a, col_b FROM f_stored_proc(E'myvalue');

ROLLBACK;

В хранимых процедурах я записываю определенные данные в таблицу журнала.Приложение запрашивает SELECT, SQLAlchemy видит только инструкцию SELECT и настаивает на ROLLBACK.Регистрация не удается.Мне нужно это COMMIT вместо этого.Мой партнер утверждает, что нет простого пути, нам бы пришлось полностью удалить SQLAlchemy.Я думаю, что он, должно быть, ошибается, но ему не хватает знания, чтобы утверждать обратное.

Есть ли простой способ сделать SQLAlchemy COMMIT вместо ROLLBACK?
Что мешает мне просто выполнить trans.commit()?Мне нужно установить autoflush=False для этого?

Я отсканировал FAQ , но не нашел там ответа.
Поиск SO выявил некоторые связанные вопросы, такие как здесь и здесь , но я не в курсе.
Может быть, этот рецепт будет работать?

1 Ответ

5 голосов
/ 27 сентября 2011

Если вы используете пул соединений SQLAlchemy, то, вероятно, вы видите автоматический откат, который происходит, когда соединение закрывается после использования.Очевидно, необходимо гарантировать, что соединение будет «чистым» в следующий раз, когда оно будет извлечено из пула.Смотрите эту страницу для получения дополнительной информации;ищите «механизм объединения» вверху.

Из того, что я помню (прошло уже пару лет с тех пор, как я в последний раз работал с этим), изменение уровня изоляции на autocommit не решит проблему, так как она победилаВ операторе SELECT не требуется фиксации.

Вы действительно просто хотите заключить этот оператор в транзакцию.Я не знаю, как структурирован ваш код, но вы должны просто использовать SQLAlchemy для connection.begin и connection.commit.Вы даже можете просто выполнить BEGIN и COMMIT как произвольный SQL.

...