2012-12-01 6 views
7

में केवल अनन्य पंक्तियों को सम्मिलित करना मैं CSV फ़ाइलों से पंक्तियों के बैच को SQLite तालिका में डालने के लिए cursor.executemany का उपयोग कर रहा हूं, जिनमें से कुछ प्राथमिक कुंजी फ़ील्ड के आधार पर डुप्लिकेट होने की उम्मीद है। जब मैं कमांड निष्पादित करता हूं, तो मुझे अनुमान लगाया जाता है कि एक ईमानदारी त्रुटि प्राप्त होती है और कुछ भी नहीं डाला जाता है।SQLite (पायथन)

मैं समय-समय पर उन्हें मैन्युअल रूप से फ़िल्टर करने के बिना चुनिंदा रूप से केवल गैर-डुप्लिकेट पंक्तियों को कैसे सम्मिलित करूं? मैं सिर्फ शुद्ध पायथन में जानता हूं कि आप केवल एक त्रुटि अपवाद बना सकते हैं और डुप्लिकेट पंक्ति को छोड़ सकते हैं - क्या इस तरह के उपयोग में कुछ ऐसा लागू हो सकता है?

+0

आप कर सकते हैं [EAFP] (http://docs.python.org/2/glossary.html#term-eafp) प्रत्येक बैच, IntegrityError के मामले में तुम वापस गिर बजाय लाइन द्वारा लाइन डालने के लिए इस बैच के लिए execemany की; फिर, केवल प्रत्येक पंक्ति EAFP और IntegrityError को अनदेखा करें। –

+0

ठीक है, मुझे लगता है कि मैं समझता हूं। मैं SQLite के लिए नया हूं - लेकिन क्या यह कुछ ऐसा है जो मैं इसे अधिक कुशल बनाने के लिए एक BEGIN/END लेनदेन में लपेटना चाहता हूं? – ChrisArmstrong

उत्तर

17

डुप्लिकेट को अनदेखा करने के लिए बस INSERT OR IGNORE का उपयोग करें।

http://sqlite.org/lang_insert.html

+0

धन्यवाद! यह वह समाधान था जिसकी मैं उम्मीद कर रहा था ... – ChrisArmstrong

+0

यह एक अच्छा जवाब है। – jdotjdot

+0

ए 'डुप्लिकेट' एक पंक्ति है जो इसकी प्राथमिक कुंजी किसी अन्य पंक्ति या किसी कॉलम के बराबर है? –

1

एक विकल्प बस executemany का उपयोग करने के बजाय त्रुटि त्रुटि के साथ लूप को मैन्युअल रूप से लिख रहा है।

Psuedocode:

for row in csvfile: 
    try: 
     cursor.execute('INSERT INTO X (Y) VALUES (%s)' % row[rowdatapoint]) 
    except IntegrityError: 
     pass 

शायद नहीं executemany के रूप में के रूप में कुशल है, लेकिन यह अधिक जटिल एसक्यूएल परिवर्तन है कि संभवतः एक विशाल INSERT एसक्यूएल स्ट्रिंग pregenerating आप शामिल होगा में प्राप्त करने का आपका त्रुटि कम पकड़ लेंगे।

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

  • कोई संबंधित समस्या नहीं^_^