Sto usando Python con psycopg2 e sto cercando di eseguire un intero VACUUM
dopo un'operazione giornaliera che inserisce diverse migliaia di righe. Il problema è che quando si tenta di eseguire il comando VACUUM
nel mio codice ottengo il seguente errore:PostgreSQL: come eseguire VACUUM dal codice al di fuori del blocco di transazione?
psycopg2.InternalError: VACUUM cannot run inside a transaction block
Come si esegue questo dal codice all'esterno di un blocco di transazione?
Se si fa la differenza, ho una semplice classe di astrazione DB, un sottoinsieme di che è visualizzato sotto per il contesto (non eseguibile, gestione delle eccezioni e docstring omessi e le rettifiche della linea che attraversa fatto):
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)
provare a inviare END TRANSACTION? – nosklo
@nosklo, buon suggerimento, ma secondo i documenti Postgres è lo stesso di COMMIT. –
Stai usando SQLAlchemy per caso? Ho riscontrato un problema simile perché l'impostazione autocommit = True in SqlAlchemy non * effettivamente * disattiva le transazioni. L'uso di 'set_isolation_level' è un modo per aggirare che accede ai metodi interni della connessione psycopg2. –