Можно ли выдать «VACUUM ANALYZE <tablename>» из psycopg2 или sqlalchemy для PostgreSQL? - PullRequest
6 голосов
/ 14 октября 2010

Ну, вопрос в значительной степени обобщает это. Моя база данных очень интенсивно обновляется, и я хочу программно выпустить анализ вакуума. Однако я получаю сообщение об ошибке, в котором говорится, что запрос не может быть выполнен в рамках транзакции. Есть ли другой способ сделать это?

Ответы [ 2 ]

11 голосов
/ 14 октября 2010

Это недостаток Python DB-API: он запускает транзакцию для вас.Это не должно делать это;должно ли и когда начинать транзакцию решать программист.Низкоуровневые основные API-интерфейсы, подобные этому, не должны присматривать за разработчиком и делать такие вещи, как запуск транзакций за нашими спинами.Мы большие мальчики - мы можем сами начинать транзакции, спасибо.

С psycopg2 вы можете отключить это неудачное поведение с помощью расширения API: call connection.autocommit().К сожалению, для этого не существует стандартного API, поэтому вы должны зависеть от нестандартных расширений для выдачи команд, которые должны выполняться вне транзакции.Я тоже был укушен этим раньше.

7 голосов
/ 28 января 2017

Вы можете включить режим Postgres autocommit, используя SQLAlchemy's raw_connection (который даст вам «сырое» соединение psycopg2):

import sqlalchemy
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT


engine = sqlalchemy.create_engine(url)
connection = engine.raw_connection()
connection.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
cursor = connection.cursor()
cursor.execute("VACUUM ANALYSE table_name")
...