programing

sqlite3.프로그래밍 오류:제공된 바인딩 수가 잘못되었습니다.현재 스테이트먼트에서는 1을 사용하고 있으며 74가 제공되고 있습니다.

goodsources 2022. 12. 29. 20:35
반응형

sqlite3.프로그래밍 오류:제공된 바인딩 수가 잘못되었습니다.현재 스테이트먼트에서는 1을 사용하고 있으며 74가 제공되고 있습니다.

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-fixed-it-aww-man-the-tire-pressures-low.gif"입니다.

삽입하기 전에 str(array[cnt])을 시도했지만 동일한 문제가 발생하고 있습니다.데이터베이스에는 TEXT 값인 열이 1개밖에 없습니다.

몇 시간 동안 계속했는데 무슨 일인지 모르겠어요.

시퀀스를 통과해야 하는데 파라미터를 태플화하기 위해 콤마를 잊어버렸습니다.

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

쉼표가 없으면(img)그룹화된 표현일 뿐이며 태플이 아니기 때문에img문자열은 입력 시퀀스로 취급됩니다.이 문자열의 길이가 74자인 경우 Python은 각각 1자씩 74개의 개별 바인드 값으로 간주합니다.

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

읽기 쉬운 경우는, 리스트 리터럴을 사용할 수도 있습니다.

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

하나의 컬럼 데이터만 취급하지만 구문은 여러 컬럼을 동시에 처리할 수 있는 호환성이 있기 때문에 문자열을 태플에 캐스팅해야 하는 이유를 알 수 없습니다.

다음 방법으로 해결할 수 있습니다.zip:cursor.execute('INSERT INTO images VALUES(?)', zip(img)).

여러 개를 피하려면execute목록 내의 문자열을 저장하고 단일 호출로 테이블을 갱신할 수 있습니다.executemany:

def insert(array):
    connection = sqlite3.connect('images.db')
    cursor = connection.cursor()
    cnt = 0
    imgs = []
    while cnt != len(array):
        img = array[cnt]
        print(array[cnt])
        imgs.append(img)
        cnt += 1

    cursor.executemany('INSERT INTO images VALUES(?)', zip(imgs))

executemany행지향의zip의 '변화'를 일으키다imgs일렬로

언급URL : https://stackoverflow.com/questions/16856647/sqlite3-programmingerror-incorrect-number-of-bindings-supplied-the-current-sta

반응형