2013-08-05 6 views
21

मैं पोस्टग्रेस्क्ल डेटाबेस तालिका में रिकॉर्ड को डालने और डालने के लिए निम्न का उपयोग कर रहा हूं, लेकिन यह काम नहीं कर रहा है। मुझे कोई त्रुटि नहीं है, लेकिन तालिका में कोई रिकॉर्ड नहीं है। क्या मुझे प्रतिबद्धता या कुछ चाहिए? मैं postgresql डेटाबेस का उपयोग कर रहा हूं जो बिटमैनी djangostack इंस्टॉल के साथ स्थापित किया गया था।पायथन psycopg2 postgresql तालिका में सम्मिलित नहीं है

import psycopg2 

try: 
    conn = psycopg2.connect("dbname='djangostack' user='bitnami' host='localhost' password='password'") 
except: 
    print "Cannot connect to db" 

cur = conn.cursor() 

try: 
    cur.execute("""insert into cnet values ('r', 's', 'e', 'c', 'w', 's', 'i', 'd', 't')""") 
except: 
    print "Cannot insert" 
+3

चेतावनी: 'सिवाय इसके कि:' विशिष्ट अपवाद को पकड़ने वाले खंड डीबगिंग कोड में सभी सहायक नहीं हैं। – bernie

उत्तर

44

हैं पर conn.commit() जरूरत डेटाबेस के लिए प्रत्येक प्रविष्टि के लिए प्रतिबद्ध करने के लिए नहीं करना चाहते हैं, तो आप निम्न पंक्ति जोड़ सकते हैं:

conn.autocommit = True 

तो अपने जिसके परिणामस्वरूप कोड होगा:

import psycopg2 

try: 
    conn = psycopg2.connect("dbname='djangostack' user='bitnami' host='localhost' password='password'") 
    conn.autocommit = True 
except: 
    print "Cannot connect to db" 

cur = conn.cursor() 

try: 
    cur.execute("""insert into cnet values ('r', 's', 'e', 'c', 'w', 's', 'i', 'd', 't')""") 
except: 
    print "Cannot insert" 
+0

हाय राइट, क्या आपको पता है कि क्या होता है यदि आपके पास ऑटोकॉमिट सेट सही नहीं है और आप कभी प्रतिबद्ध नहीं हैं? ऐसा लगता है कि तालिका के क्रम में अनुक्रम, लेकिन पंक्तियां कहां हैं? –

+0

@ डैनियल बॉघमैन: ऐसा इसलिए है क्योंकि अनुक्रम बढ़ते हैं भले ही आप प्रतिबद्ध न हों; उदाहरण देखें [अनुक्रम लेनदेन से प्रभावित नहीं है? ] (https://stackoverflow.com/questions/2095917/sequences-not-affected-by-transactions) – user1071847

2

psycopg2है-संगत, इसलिए स्वत: प्रतिबद्धता सुविधा डिफ़ॉल्ट रूप से बंद है। डेटाबेस में लंबित लेनदेन करने के लिए आपको conn.commit पर कॉल करने की आवश्यकता है। के रूप में कनेक्शन (और कर्सर) संदर्भ प्रबंधक हैं, तो आप बस with बयान उपयोग कर सकते हैं स्वचालित रूप से प्रतिबद्ध/संदर्भ छोड़ने पर लेन-देन को रोलबैक करने के लिए:

with conn, conn.cursor() as cur: # start a transaction and create a cursor 
    cur.execute(sql) 

docs से:

जब एक कनेक्शन बाहर निकलता है with ब्लॉक, यदि कोई अपवाद ब्लॉक द्वारा उठाया गया है, लेनदेन प्रतिबद्ध है। अपवाद के मामले में लेनदेन वापस लुढ़का हुआ है।

जब कोई कर्सर with ब्लॉक से बाहर निकलता है तो यह बंद हो जाता है, अंततः संसाधन को इसके साथ संबद्ध संसाधन जारी करता है। लेनदेन की स्थिति प्रभावित नहीं है।

संबंधित मुद्दे