sqlite3.ProgrammingError: Số lượng ràng buộc được cung cấp không chính xác. Câu lệnh hiện tại sử dụng 1 và có 74 câu được cung cấp


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()

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ế 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 -tire-áp lực-low.gif "

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

Tôi đã ở đó hàng giờ và tôi không thể hiểu chuyện gì đang xảy ra.

Câu trả lời:


380

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

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

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

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

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

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

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

6
Cái này cũng cắn tôi. Nếu "lập trình viên tiên tiến" bị đánh lừa bởi điều này, điều đó có nghĩa là nó không trực quan. IMHO sẽ tự nhiên hơn nếu thực thi () 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 ý!
Laryx Decidua

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

sử dụng %scũng không được khuyến khích cho vấn đề an ninh - docs.python.org/3/library/sqlite3.html
wesinat0r

2
cursor.execute(sql,array)

Chỉ mất hai đối số.
Nó sẽ lặp lại "mảng" -object và khớp? trong chuỗi sql.
(với kiểm tra vệ sinh để tránh tiêm sql)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.