2010-10-14 9 views
6

Bene, la domanda praticamente lo riassume. La mia attività di db è molto intensiva per l'aggiornamento e desidero sottoporre a programmazione un Vacuum Analyze. Tuttavia ottengo un errore che dice che la query non può essere eseguita all'interno di una transazione. C'è un altro modo per farlo?È possibile emettere un "VACUUM ANALYZE " da psycopg2 o sqlalchemy per PostgreSQL?

+0

possibile duplicato (http://stackoverflow.com/questions/1017463/postgresql-how-to-run-vacuum-from-code-outside-transaction-block) –

+0

Grazie, è un duplicato. Come posso contrassegnarlo come uno? – donatello

risposta

9

Questo è un difetto nell'API DB Python: avvia una transazione per te. Non dovrebbe farlo; se e quando iniziare una transazione dovrebbe essere al programmatore. Le API core di basso livello come questa non dovrebbero fare da babysitter allo sviluppatore e fare cose come l'avvio di transazioni dietro le nostre spalle. Siamo grandi ragazzi: possiamo iniziare le transazioni da soli, grazie.

Con psycopg2, è possibile disattivare questo comportamento sfortunato con un'estensione API: chiamare connection.autocommit(). Non ci sono API standard per questo, sfortunatamente, quindi devi dipendere da estensioni non standard per emettere comandi che devono essere eseguiti al di fuori di una transazione.

Nessun linguaggio è privo di condilomi e questo è uno di Python. Anch'io sono stato morso da questo.

+0

solo un commento che 'connection.autocommit' è un attributo booleano, non una funzione. Quindi per eseguire query al di fuori di una transazione è possibile impostare 'connection.autocommit = True' prima di eseguire il VACUUM –

3

È possibile attivare la modalità Postgres autocommit usando di SQLAlchemy raw_connection (che vi darà una connessione psycopg2 "raw"): [? PostgreSQL - come eseguire VUOTO dal codice blocco di transazione fuori]

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")