Estoy usando Python con psycopg2 y estoy tratando de ejecutar un VACUUM
completo después de una operación diaria que inserta varios miles de filas. El problema es que cuando trato de ejecutar el comando VACUUM
dentro de mi código me sale el siguiente error:PostgreSQL: ¿cómo ejecutar VACUUM desde el código fuera del bloque de transacción?
psycopg2.InternalError: VACUUM cannot run inside a transaction block
¿Cómo ejecuto esto desde el código fuera de un bloque transacción?
Si se hace una diferencia, tengo una clase simple abstracción DB, un subconjunto de los cuales se muestra a continuación para el contexto (no ejecutable, control de excepciones y docstrings omitidos y los ajustes de línea que abarca hecho):
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)
intente con el envío END TRANSACTION? – nosklo
@nosklo, buena sugerencia, pero de acuerdo con los documentos de Postgres que es lo mismo que COMPROMETER. –
¿Estás usando SQLAlchemy por casualidad? Experimenté un problema similar porque establecer autocommit = True en SqlAlchemy no * realmente * desactiva las transacciones. Usar 'set_isolation_level' es una solución alternativa que accede a los métodos internos de la conexión psycopg2. –