Używam Pythona z psycopg2 i próbuję uruchomić pełny VACUUM
po codziennej operacji, która wstawia kilka tysięcy wierszy. Problem polega na tym, że gdy próbuję uruchomić komendę VACUUM
wewnątrz mojego kodu pojawia się następujący błąd:PostgreSQL - jak uruchomić VACUUM z kodu poza blokiem transakcji?
psycopg2.InternalError: VACUUM cannot run inside a transaction block
Jak uruchomić ten z kodem poza blokiem transakcji?
Jeśli to robi różnicę, mam prosty DB klasę abstrakcji, podzbiór, który jest wyświetlany poniżej kontekście (nie runnable, obsługi wyjątków i docstrings pominiętych i korekty linii obejmujących złożony):
class db(object):
def __init__(dbname, host, port, user, password):
self.conn = psycopg2.connect("dbname=%s host=%s port=%s \
user=%s password=%s" \
% (dbname, host, port, user, password))
self.cursor = self.conn.cursor()
def _doQuery(self, query):
self.cursor.execute(query)
self.conn.commit()
def vacuum(self):
query = "VACUUM FULL"
self._doQuery(query)
spróbować wysłać KONIEC TRANSAKCJI? – nosklo
@nosklo, Dobra sugestia, ale według dokumentów Postgresa jest taka sama jak COMMIT. –
Czy używasz SQLAlchemy przez przypadek? Doświadczyłem podobnego problemu, ponieważ ustawienie autocommit = True w SqlAlchemy nie * faktycznie * wyłącza transakcji. Używanie 'set_isolation_level' jest pracą wokół, która uzyskuje dostęp do wewnętrznych metod połączenia psycopg2. –