2010-07-09 26 views
6

पाइथन में लोडिंग जारी रखें, मैं importmany का उपयोग कर SQLite डेटा बेस पॉप्युलेट कर रहा हूं, इसलिए मैं एक बार में डेटा की हजारों पंक्तियों को आयात कर सकता हूं। मेरा डेटा tuples की एक सूची के रूप में निहित है। मैंने अपना डेटाबेस प्राथमिक कुंजी के साथ स्थापित किया था जहां मैं उन्हें चाहता था।IntegrityError

समस्या मैं भाग गया था प्राथमिक कुंजी त्रुटियां एक इंटीग्रिटी एरर फेंक देंगे। अगर मैं अपवाद को संभालता हूं तो मेरी स्क्रिप्ट प्राथमिक कुंजी संघर्ष पर आयात करना बंद कर देती है।
कोशिश:

try: 
    self.curs.executemany("INSERT into towers values (NULL,?,?,?,?)",self.insertList) 
except IntegrityError: 
    print "Primary key error" 
conn.commit() 


तो मेरे सवालों का, अजगर में importmany उपयोग कर रहे हैं कर सकते हैं मैं:

1. कब्जा मूल्यों कि प्राथमिक कुंजी का उल्लंघन है?
2. मेरी प्राथमिक कुंजी त्रुटियों के बाद डेटा लोड करना जारी रखें।

मुझे लगता है कि यह क्यों लोड नहीं होता है, क्योंकि अपवाद के बाद मैं डेटाबेस को डेटा प्रतिबद्ध करता हूं। मैं नहीं जानता कि कैसे जारी रखा जाए, हालांकि मैंने छोड़ा था।

Unforutnley मैं इस नेटवर्क पर सभी कोड कॉपी और पेस्ट नहीं कर सकता, किसी भी मदद की सराहना की जाएगी। अभी मेरे पास कोई पीकेएस के चारों ओर एक काम के रूप में सेट तुम कहाँ बंद कर दिया है ...

उत्तर

0

सूची के माध्यम से पुनरावृत्त करने के लिए लूप के लिए उपयोग करें और execemany के बजाय निष्पादन का उपयोग करें। अपनी कोशिश के साथ लूप के आस-पास और अपवाद के बाद निष्पादन जारी रखें। कुछ इस तरह:

for it in self.insertList: 
    try: 
     self.curs.execute("INSERT into towers values (NULL,?,?,?,?)",it) 
    except IntegrityError: 
     #here you could insert the itens that were rejected in a temporary table 
     #without constraints for later use (question 1) 
     pass 
conn.commit() 

तुम भी भरोसा कर सकते हैं कि कैसे इस सूची के कई मदों वास्तव में डाला गया।

+0

जैसा कि मैं इसे समझता हूं, 'execemany' मौजूद है क्योंकि यह पायथन-पुनरावृत्त' execute' आदेशों पर एक महत्वपूर्ण गति वृद्धि प्रदान करता है। तो आपका समाधान, जबकि यह काम करेगा, एक विशाल डेटा आयात को धीमा कर देगा। एक समाधान एक पाइथन सेट में जोड़े गए प्राथमिक कुंजी का ट्रैक रखना होगा और कर्सर को इसे खिलाने से पहले समय से पहले सम्मिलित करें फ़िल्टर को फ़िल्टर करें। –

+0

@ पीटर एमसीएमन ठीक है मैं सहमत हूं। यह कुशल कोड नहीं है। जैसा कि आपने कहा है यह केवल "काम करता है"। – jheyse

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