2010-10-14 26 views
6

Cóż, to pytanie w dużym stopniu to podsumowuje. Moja aktywność db jest bardzo intensywnie aktualizowana i chcę programowo wystawić analizę próżni. Jednak pojawia się błąd, który mówi, że kwerendy nie można wykonać w ramach transakcji. Czy jest jakiś inny sposób na zrobienie tego?Czy jest możliwe wystawienie "VACUUM ANALYZE <tablename>" z psycopg2 lub sqlalchemy dla PostgreSQL?

+0

możliwe duplikat (http://stackoverflow.com/questions/1017463/postgresql-how-to-run-vacuum-from-code-outside-transaction-block) –

+0

Dzięki, to jest duplikat. Jak mogę oznaczyć to jako jedno? – donatello

Odpowiedz

9

To jest błąd w Python DB-API: rozpoczyna transakcję dla ciebie. Nie powinno to robić; czy i kiedy rozpocząć transakcję powinna należeć do programisty. Niskopoziomowe, podstawowe interfejsy API, takie jak te, nie powinny opiekować się programistą i robić rzeczy, jak na przykład inicjowanie transakcji za naszymi plecami. Jesteśmy dużymi chłopcami - możemy sami rozpocząć transakcje, dziękuję.

W psycopg2 możesz wyłączyć to niefortunne zachowanie dzięki rozszerzeniu interfejsu API: zadzwoń pod numer connection.autocommit(). Niestety, nie ma standardowego API, więc musisz polegać na niestandardowych rozszerzeniach, aby wydawać polecenia, które muszą być wykonywane poza transakcją.

Żaden język nie jest pozbawiony brodawek, a to jest język Pythona. Byłem też ukąszony przez to wcześniej.

+0

tylko komentarz, że 'connection.autocommit' jest atrybutem boolowskim, a nie funkcją. Aby wykonać zapytania poza transakcją, można ustawić opcję 'connection.autocommit = True' przed wykonaniem ODKURZACZA –

3

Można włączyć Postgres trybie autocommit użyciu SQLAlchemy na raw_connection (co daje „surowego” Połączenie psycopg2) [? PostgreSQL - jak uruchomić wodociągowe z kodem zewnętrznym bloku transakcji]

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