sqlite3.ProgrammingError: จำนวนการผูกที่ให้มาไม่ถูกต้อง คำสั่งปัจจุบันใช้ 1 และมี 74 ที่ให้มา


187
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

ฉันอยู่ที่นี่มาหลายชั่วโมงแล้วและไม่สามารถเข้าใจได้ว่าเกิดอะไรขึ้น

คำตอบ:


380

คุณต้องผ่านลำดับ แต่คุณลืมเครื่องหมายจุลภาคเพื่อทำให้พารามิเตอร์ของคุณเป็น tuple:

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

หากไม่มีเครื่องหมายจุลภาค(img)เป็นเพียงนิพจน์ที่ถูกจัดกลุ่มไม่ใช่ tuple และทำให้imgสตริงนั้นถือว่าเป็นลำดับอินพุต หากสตริงนั้นมีความยาว 74 ตัวอักษร Python จะเห็นว่าเป็น 74 ค่าการเชื่อมโยงที่แยกจากกันซึ่งแต่ละตัวจะยาว

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

หากคุณพบว่าอ่านง่ายขึ้นคุณสามารถใช้รายการตามตัวอักษร:

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

37
เราเป็นนักเขียนโค้ดขั้นสูงมากมายที่ทำผิดพลาดดังนั้นไม่จำเป็นต้องรู้สึกงี่เง่า :)
MrGumble

6
บิตนี้ฉันเช่นกัน หาก "coders ขั้นสูง" หลงกลโดยสิ่งนี้แสดงว่าไม่ใช้งานง่าย IMHO จะเป็นธรรมชาติมากขึ้นถ้า execute () ใช้ค่าเดียวแทนที่จะเป็น tuple ที่มีค่าเดียวหากมีเพียงค่าเดียว ในแบบสอบถาม อย่างไรก็ตามขอบคุณสำหรับคำใบ้!
กล่องเสียง Decidua

5
@ user465139: %โอเปอเรเตอร์strที่ใช้เวทย์มนตร์แบบนั้น - มันถือว่า tuple เป็นค่าหลายค่า แต่ a str(หรือประเภทอื่น ๆ ของ iterable) เป็นค่าเดียว แต่นั่นทำให้เกิดความสับสนบ่อยกว่าการแก้มันซึ่งเป็นสาเหตุที่แทบไม่มีอะไรใน stdlib ที่พยายามใช้เวทมนตร์ชนิดนั้น
abarnert

การใช้%sไม่แนะนำสำหรับปัญหาด้านความปลอดภัย - docs.python.org/3/library/sqlite3.html
wesinat0r

2
cursor.execute(sql,array)

ใช้เวลาเพียงสองข้อโต้แย้ง
มันจะย้ำ "อาร์เรย์" -object และการจับคู่? ใน sql-string
(ด้วยการตรวจสอบสติเพื่อหลีกเลี่ยงการฉีด sql)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.