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-pressures-low.gif "

삽입하기 전에 str (array [cnt])을 시도했지만 동일한 문제가 발생하며 데이터베이스에는 하나의 열만 있습니다 (텍스트 값).

나는 몇 시간 동안 그것을 보았고 무슨 일이 일어나고 있는지 알 수 없습니다.

답변:


380

시퀀스를 전달해야하지만 매개 변수를 튜플로 만드는 쉼표를 잊어 버렸습니다.

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

쉼표 (img)가 없으면 튜플이 아닌 그룹화 된 표현식이므로 img문자열이 입력 시퀀스로 처리됩니다. 해당 문자열의 길이가 74자인 경우 Python은 각 문자 길이가 74 개인 별도의 바인드 값으로 인식합니다.

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

읽기가 더 쉽다면 목록 리터럴을 사용할 수도 있습니다.

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

37
우리는 그 실수를 저지른 고급 코더가 많으므로 어리석게 느낄 필요가 없습니다. :)
MrGumble

6
이것도 나에게 물렸다. "고급 코더"가 이것에 의해 속이는 것은 직관적이지 않다는 것을 의미합니다. IMHO 하나만 있으면 execute ()가 단일 값 튜플 대신 단일 값을 사용하면 더 자연 스럽습니까? 쿼리에서. 어쨌든 힌트 주셔서 감사합니다!
Laryx Decidua

5
@ user465139 : %연산자를 사용 str하면 튜플을 여러 값으로 취급하지만 str(또는 다른 종류의 반복 가능) 단일 값으로 취급합니다. 그러나 그것은 그것을 해결하는 것보다 훨씬 더 혼란을 야기하기 때문에 stdlib의 다른 어떤 것도 그러한 종류의 마술을 시도하지 않습니다.
abarnert

%s보안 관련 문제로 사용 하지 않는 것이 좋습니다 -docs.python.org/3/library/sqlite3.html
wesinat0r

2
cursor.execute(sql,array)

두 가지 주장 만 취합니다.
"배열"객체를 반복하고 일치합니까? sql-string에서.
(sql-injection을 피하기 위해 온 전성 검사 포함)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.