2010-10-14 13 views
6

Eh, soru oldukça özetliyor. Benim db aktivitesi çok yoğun bir güncelleme ve ben bir Vakum Analizi programlı olarak yayınlamak istiyorum. Ancak, sorgunun bir işlem içinde yürütülemediğini söyleyen bir hata alıyorum. Bunu yapmanın başka yolu var mı?PostgreSQL için psycopg2 veya sqlalchemy'den "VACUUM ANALYZE <tablename>" yayımlamak mümkün mü?

+0

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

+0

Teşekkürler, bu bir kopya. Bunu nasıl bir işaret olarak işaretleyebilirim? – donatello

cevap

9

Bu, Python DB-API'sindeki bir kusurdur: sizin için bir işlem başlatır. Bunu yapmamalı; Bir işlemin başlatılıp başlatılmayacağı ve ne zaman başlatılacağı programcıya kadar olmalıdır. Bunun gibi düşük seviyeli, çekirdek API'lar geliştiriciyi önemsememeli ve arkamızdaki işlemlere başlamak gibi şeyler yapmamalı. Biz büyük çocuklarız - kendimize işlem başlatabiliriz, teşekkürler.

psycopg2 ile, bu talihsiz davranışı bir API uzantısı ile devre dışı bırakabilirsiniz: connection.autocommit() numaralı telefonu arayın. Bunun için standart bir API yok, maalesef, bir işlem dışında yürütülmesi gereken komutları vermek için standart olmayan uzantılara bağlı olmanız gerekiyor.

Hiçbir dil siğilsizdir ve bu Python'un biridir. Ben de bundan önce ısırıldım.

+0

sadece 'connection.autocommit' bir işlev değil, bir boole özniteliğidir. Bir işlemin dışındaki sorguları yürütmek için VACUUM'u çalıştırmadan önce 'connection.autocommit = True 'değerini ayarlayabilirsiniz. –

3

kullanarak Postgres autocommit modu açabilirsiniz SQLAlchemy en raw_connection (sana bir "ham" psycopg2 bağlantısını verecektir): [? PostgreSQL - kod dışında işlem bloktan VAKUM nasıl çalıştırılacağını]

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") 
ait
İlgili konular