2010-10-14 12 views
6

खैर, सवाल काफी संक्षेप में है। मेरी डीबी गतिविधि बहुत अद्यतन गहन है, और मैं प्रोग्रामेटिक रूप से वैक्यूम विश्लेषण जारी करना चाहता हूं। हालांकि मुझे एक त्रुटि मिलती है जो कहती है कि लेनदेन के भीतर क्वेरी निष्पादित नहीं की जा सकती है। क्या ऐसा करने का कोई और तरीका है?क्या पोस्टग्रेएसक्यूएल के लिए psycopg2 या sqlalchemy से "वैक्यूम विश्लेषण <tablename>" जारी करना संभव है?

+0

संभव डुप्लिकेट (http://stackoverflow.com/questions/1017463/postgresql-how-to-run-vacuum-from-code-outside-transaction-block) –

+0

धन्यवाद, यह एक डुप्लिकेट है। मैं इसे एक के रूप में कैसे चिह्नित कर सकता हूं? – donatello

उत्तर

9

यह पायथन डीबी-एपीआई में एक दोष है: यह आपके लिए एक लेनदेन शुरू करता है। ऐसा नहीं करना चाहिए; चाहे लेनदेन शुरू करना है या नहीं, प्रोग्रामर तक होना चाहिए। निम्न स्तर के, निम्न एपीआई जैसे डेवलपर को बेबीसिट नहीं करना चाहिए और चीजों को हमारी पीठ के पीछे लेनदेन शुरू करना चाहिए। हम बड़े लड़के हैं - हम खुद को लेनदेन शुरू कर सकते हैं, धन्यवाद।

psycopg2 के साथ, आप एपीआई एक्सटेंशन के साथ इस दुर्भाग्यपूर्ण व्यवहार को अक्षम कर सकते हैं: connection.autocommit() पर कॉल करें। दुर्भाग्यवश, इसके लिए कोई मानक एपीआई नहीं है, इसलिए आपको लेन-देन के बाहर निष्पादित किए जाने वाले आदेश जारी करने के लिए गैर-मानक एक्सटेंशन पर निर्भर रहना होगा।

कोई भाषा इसके वारंट के बिना है, और यह पायथन का एक है। मुझे इससे पहले भी काटा गया है।

+0

सिर्फ एक टिप्पणी है कि 'connection.autocommit' एक बूलियन विशेषता है, फ़ंक्शन नहीं। तो लेनदेन के बाहर पूछताछ निष्पादित करने के लिए आप VACUUM निष्पादित करने से पहले 'connection.autocommit = True' सेट कर सकते हैं –

3

आप का उपयोग Postgres autocommit मोड चालू कर सकते हैं SQLAlchemy के raw_connection (यदि आप एक "कच्चे" psycopg2 कनेक्शन दे देंगे): [? PostgreSQL - कोड के बाहर लेनदेन ब्लॉक से वैक्यूम चलाने के लिए कैसे]

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") 
की
संबंधित मुद्दे