2013-05-31 28 views
93
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() 

Tôi không thể hiểu tại sao điều này gây ra lỗi cho tôi, Chuỗi thực tế mà tôi đang cố gắng chèn dài 74 ký tự, đó là: "/ gifs/epic-fail -photos-there-i-fixed-it-aww-man-the-lốp-áp-thấp.gif "sqlite3.ProgrammingError: Số lượng các ràng buộc không chính xác được cung cấp. Câu lệnh hiện tại sử dụng 1 và có 74 được cung cấp

Tôi đã cố gắng để str (mảng [cnt]) trước khi chèn nó, nhưng vấn đề tương tự là xảy ra, cơ sở dữ liệu chỉ có một cột, là một giá trị TEXT.

Tôi đã ở đó hàng giờ và tôi không thể tìm ra những gì đang diễn ra.

Trả lời

192

Bạn cần phải vượt qua trong một chuỗi, nhưng bạn quên mất dấu phẩy để làm cho thông số của bạn một tuple:

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

Nếu không có dấu phẩy, (img) chỉ là một biểu hiện nhóm, không phải là một tuple, và do đó img chuỗi được coi là chuỗi đầu vào. Nếu chuỗi đó dài 74 ký tự, thì Python thấy rằng là 74 giá trị liên kết riêng biệt, mỗi ký tự dài.

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

Nếu bạn tìm thấy nó dễ dàng hơn để đọc, bạn cũng có thể sử dụng danh sách đen:

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

Chúng tôi rất nhiều lập trình viên cao cấp mà đã làm cho sai lầm đó, vì vậy không cần phải cảm thấy ngu ngốc. :) – MrGumble

+1

Điều này bit tôi, quá. Nếu "lập trình viên nâng cao" bị lừa bởi điều này, điều đó có nghĩa là nó không trực quan. IMHO nó sẽ tự nhiên hơn nếu thực hiện() lấy một giá trị duy nhất thay vì một bộ giá trị đơn nếu chỉ có một? trong truy vấn. Dù sao, cảm ơn cho gợi ý! –

+3

@ user465139: Toán tử '%' trên 'str' thực hiện loại phép thuật đó - nó xử lý một bộ dữ liệu dưới dạng nhiều giá trị, nhưng một' str' (hoặc bất kỳ loại nào khác có thể lặp lại) dưới dạng một giá trị đơn lẻ. Nhưng điều đó gây ra sự nhầm lẫn thường xuyên hơn nhiều so với nó giải quyết nó, đó là lý do tại sao hầu như không có gì khác trong stdlib cố gắng loại ma thuật. – abarnert

Các vấn đề liên quan