sqlite3.ProgrammingError: आपूर्ति की गई बाइंडिंग की गलत संख्या। वर्तमान कथन 1 का उपयोग करता है, और 74 की आपूर्ति की जाती है


185
def insert(array):
    connection=sqlite3.connect('images.db')
    cursor=connection.cursor()
    cnt=0
    while cnt != len(array):
            img = array[cnt]
            print(array[cnt])
            cursor.execute('INSERT INTO images VALUES(?)', (img))
            cnt+= 1
    connection.commit()
    connection.close()

मैं यह पता नहीं लगा सकता कि यह मुझे त्रुटि क्यों दे रहा है, मैं जिस वास्तविक स्ट्रिंग को सम्मिलित करने का प्रयास कर रहा हूं वह 74 वर्ण लंबा है, यह है: "/ gifs / epic-fail-photos-there-i-fixed-it-aww-man-the -tire-दबाव-low.gif "

मैंने इसे डालने से पहले str (array [cnt]) करने की कोशिश की है, लेकिन एक ही समस्या हो रही है, डेटाबेस में केवल एक कॉलम है, जो TEXT मान है।

मैं इसके लिए घंटों तक रहा हूं और मैं समझ नहीं पाया कि क्या चल रहा है।

जवाबों:


378

आपको एक अनुक्रम में पास होने की आवश्यकता है, लेकिन आप अपने मापदंडों को तुच्छ बनाने के लिए अल्पविराम को भूल गए:

cursor.execute('INSERT INTO images VALUES(?)', (img,))

अल्पविराम के बिना, (img)केवल एक समूहीकृत अभिव्यक्ति है, न कि एक टपल, और इस प्रकार imgस्ट्रिंग को इनपुट अनुक्रम के रूप में माना जाता है। यदि वह स्ट्रिंग 74 वर्ण लंबा है, तो पायथन देखता है कि 74 अलग-अलग बाइंड मानों के रूप में, प्रत्येक एक वर्ण लंबा है।

>>> len(img)
74
>>> len((img,))
1

यदि आपको पढ़ना आसान लगता है, तो आप सूची शाब्दिक का भी उपयोग कर सकते हैं:

cursor.execute('INSERT INTO images VALUES(?)', [img])

37
हम बहुत सारे उन्नत कोडर हैं जिन्होंने यह गलती की है, इसलिए बेवकूफ महसूस करने की आवश्यकता नहीं है। :)
मृगम्बर

6
यह बिट मुझे भी। यदि "उन्नत कोडर्स" को मूर्ख बनाया जाता है, तो इसका मतलब है कि यह अनइंस्टिट्यूट है। IMHO यह अधिक स्वाभाविक होगा यदि निष्पादित () एकल-मूल्यवान टपल के बजाय एक एकल मान लिया जाए यदि केवल एक ही है? क्वेरी में। वैसे भी, संकेत के लिए धन्यवाद!
लेरिक्स डेसीडुआ

5
@ user465139: %ऑपरेटर इस strतरह का जादू करता है - यह एक टपल को कई मानों के रूप में मानता है, लेकिन एक str(या किसी अन्य प्रकार के चलने योग्य) को एक ही मूल्य के रूप में मानता है । लेकिन जो भ्रम पैदा करता है उससे कहीं अधिक बार यह हल करता है, यही कारण है कि स्टैडलिब में लगभग कुछ भी नहीं है जो इस तरह के जादू का प्रयास करता है।
२१'१४

%sसुरक्षा चिंताओं के लिए भी उपयोग की अनुशंसा नहीं की जाती है - docs.python.org/3/library/sqlite3.html
wesinat0r

2
cursor.execute(sql,array)

केवल दो तर्क देते हैं।
यह "सरणी" -object और मैच को प्रसारित करेगा? sql-string में।
(sql-injection से बचने के लिए sanity check के साथ)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.