2010-10-14 2 views
6

Nun, die Frage fasst es ziemlich zusammen. Meine db-Aktivität ist sehr update-intensiv, und ich möchte eine Vakuumanalyse programmatisch ausgeben. Ich bekomme jedoch einen Fehler, der besagt, dass die Abfrage nicht innerhalb einer Transaktion ausgeführt werden kann. Gibt es einen anderen Weg, es zu tun?Ist es möglich, ein "VACUUM ANALYZE <tablename>" von psycopg2 oder sqlalchemy für PostgreSQL auszustellen?

+0

möglich Duplikat (http://stackoverflow.com/questions/1017463/postgresql-how-to-run-vacuum-from-code-outside-transaction-block) –

+0

Danke, es ist ein Duplikat. Wie kann ich es als eins markieren? – donatello

Antwort

9

Dies ist ein Fehler in der Python DB-API: es startet eine Transaktion für Sie. Es sollte das nicht tun; ob und wann eine Transaktion gestartet werden soll, sollte dem Programmierer überlassen werden. Low-Level-Core-APIs wie diese sollten den Entwickler nicht babysitten und Dinge wie das Starten von Transaktionen hinter unserem Rücken erledigen. Wir sind große Jungs - wir können selbst Transaktionen starten, danke.

Mit psycopg2 können Sie dieses unglückliche Verhalten mit einer API-Erweiterung deaktivieren: Anruf connection.autocommit(). Dafür gibt es leider keine Standard-API. Daher müssen Sie auf nicht standardmäßige Erweiterungen angewiesen sein, um Befehle auszuführen, die außerhalb einer Transaktion ausgeführt werden müssen.

Keine Sprache ist ohne ihre Warzen, und dies ist einer von Pythons. Das hat mich auch schon mal angesteckt.

+0

nur ein Kommentar, dass 'connection.autocommit' ist ein boolesches Attribut, keine Funktion. Um Abfragen außerhalb einer Transaktion auszuführen, können Sie vor dem Ausführen von VACUUM 'connection.autocommit = True 'festlegen –

3

Sie können einschalten Postgres autocommit Modus SQLAlchemy des raw_connection (die Sie geben eine "rohe" psycopg2 Verbindung): [? PostgreSQL - wie VACUUM von Code außerhalb Transaktionsblock laufen]

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