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?
Czy jest możliwe wystawienie "VACUUM ANALYZE <tablename>" z psycopg2 lub sqlalchemy dla PostgreSQL?
Odpowiedz
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.
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 –
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")
możliwe duplikat (http://stackoverflow.com/questions/1017463/postgresql-how-to-run-vacuum-from-code-outside-transaction-block) –
Dzięki, to jest duplikat. Jak mogę oznaczyć to jako jedno? – donatello