2010-10-14 36 views
6

Eh bien, la question résume assez bien. Mon activité db est très intensive en mise à jour, et je veux programmer une analyse de vide. Cependant, j'obtiens une erreur indiquant que la requête ne peut pas être exécutée dans une transaction. Y a-t-il un autre moyen de le faire?Est-il possible d'émettre un "VACUUM ANALYZE <tablename>" à partir de psycopg2 ou sqlalchemy pour PostgreSQL?

+0

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

+0

Merci, c'est un doublon. Comment puis-je le marquer comme un? – donatello

Répondre

9

Ceci est une faille dans l'API DB de Python: elle lance une transaction pour vous. Cela ne devrait pas faire ça. si et quand commencer une transaction devrait être à la hauteur du programmeur. Les API de base de bas niveau comme celle-ci ne devraient pas garder le développeur et faire des choses comme démarrer des transactions dans notre dos. Nous sommes de grands garçons - nous pouvons commencer nous-mêmes les transactions, merci.

Avec psycopg2, vous pouvez désactiver ce comportement malheureux avec une extension API: appelez connection.autocommit(). Il n'y a malheureusement pas d'API standard pour cela, donc vous devez dépendre d'extensions non standard pour émettre des commandes qui doivent être exécutées en dehors d'une transaction.

Aucune langue n'est sans ses verrues, et c'est l'un des Python. J'ai été mordu par ça avant aussi.

+0

juste un commentaire que 'connection.autocommit' est un attribut booléen, pas une fonction. Pour exécuter des requêtes en dehors d'une transaction, vous pouvez définir 'connection.autocommit = True' avant d'exécuter le VACUUM. –

3

Vous pouvez activer le mode Postgres autocommit à l'aide raw_connection de SQLAlchemy (ce qui vous donnera une "première" connexion psycopg2): [? PostgreSQL - comment exécuter VACUUM à partir du code extérieur bloc de transaction]

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