2009-09-20 14 views
9

मैं पाइथन और पायथन के MySQL एडाप्टर के लिए नया हूं। मुझे यकीन नहीं है कि अगर मुझे कुछ स्पष्ट याद आ रहा है:पायथन MySQL - काम चुनता है लेकिन हटा नहीं जाता है?

db = MySQLdb.connect(# db details omitted) 
cursor = self.db.cursor() 

# WORKS 
cursor.execute("SELECT site_id FROM users WHERE username=%s", (username)) 
record = cursor.fetchone() 

# DOES NOT SEEM TO WORK 
cursor.execute("DELETE FROM users WHERE username=%s", (username)) 

कोई विचार?

+3

क्या विशेषाधिकार आप डेटाबेस पर है? – ennuikiller

+0

हाँ सुनिश्चित करें कि आप जिस उपयोगकर्ता का उपयोग कर रहे हैं वह पंक्तियों को हटाने का अधिकार है। –

+0

जब आप कहते हैं "काम करने के लिए नहीं लगता": आप कैसे जानते हैं? क्या आपको किसी प्रकार का त्रुटि संदेश मिलता है? यदि हां, तो कौन सा? कृपया सभी विवरणों को पहले से रिपोर्ट करें। –

उत्तर

12

मुझे लगता है कि आप एक स्टोरेज इंजन का उपयोग कर रहे हैं जो लेनदेन का समर्थन करता है (जैसे InnoDB) लेकिन आप DELETE के बाद db.commit() पर कॉल नहीं करते हैं। यदि आप प्रतिबद्ध नहीं हैं तो DELETE का प्रभाव त्याग दिया जाता है।

http://mysql-python.sourceforge.net/FAQ.html#my-data-disappeared-or-won-t-go-away देखें:

1.2.0 के साथ शुरू, MySQLdb डिफ़ॉल्ट रूप से autocommit अक्षम कर देता है, के रूप में के लिए आवश्यक डीबी एपीआई मानक (पीईपी-249)। आप InnoDB टेबल या लेन-देन संबंधी तालिका प्रकार के कुछ अन्य प्रकार, उपयोग कर रहे हैं आप कनेक्शन बंद करने से पहले connection.commit() करने की आवश्यकता होगी, वरना अपने परिवर्तनों के कोई भी डेटाबेस के लिए लिखा जाएगा।

भी देखें इस समान तो सवाल: Python MySQLdb update query fails

+0

बिंगो! यह पाइथन-विशिष्ट चीज है जिसे मैं ढूंढ रहा था, क्योंकि उपरोक्त किसी भी समस्या के बिना सीधे PHP या रूबी में काम नहीं करता था। धन्यवाद दोस्तों! –

+0

ने कल इस के साथ अपना सिर तोड़ दिया ... क्यों पता लगाने के लिए कुछ समय लगा। क्या आपको लगता है कि सबकुछ एक साथ करने का प्रदर्शन लाभ है? यानी, लूप में प्रत्येक इंस्टेंस को हटाने के बजाय, अंत में बंद होने से पहले? – Cmag

+1

हां, निश्चित रूप से एक प्रदर्शन लाभ है। उदाहरण के लिए, InnoDB के लिए डिफ़ॉल्ट कॉन्फ़िगरेशन प्रत्येक लेनदेन प्रतिबद्धता के बाद 'fsync()' करता है। Http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit देखें –

0
ऊपर अपने कोड के लिए

, सिर्फ self.db.commit() के लिए एक कॉल जोड़ें।

सुविधा एक झुंझलाहट से दूर है:

यह डेटा भ्रष्टाचार से बचाता है जब आपके प्रश्नों में त्रुटियाँ हैं जारी करता है।

1

शायद आप एक विदेशी कुंजी बाधा का उल्लंघन कर रहे हैं।

0

समस्या यह हो सकती है कि आप परिवर्तन नहीं कर रहे हैं। यह conn.commit()

द्वारा किया जा सकता पर अधिक पढ़ सकते हैं इस here

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