sqlite3.ProgrammingError: Podano nieprawidłową liczbę powiązań. Bieżąca instrukcja używa 1, a są dostępne 74

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

Nie mogę zrozumieć, dlaczego powoduje to błąd. Rzeczywisty ciąg, który próbuję wstawić, ma 74 znaki, to jest: "/ gifs / epic-fail-photos-there-i-fixed-it-aww-man-the -tire-pressure-low.gif "

Próbowałem str (array [cnt]) przed wstawieniem go, ale ten sam problem się dzieje, baza danych ma tylko jedną kolumnę, która jest wartością TEKST.

Siedzę przy tym od godzin i nie wiem, co się dzieje.

AB49K
źródło

Odpowiedzi:

410

Musisz przekazać sekwencję, ale zapomniałeś przecinka, aby twoje parametry były krotką:

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

Bez przecinka (img)jest to tylko wyrażenie zgrupowane, a nie krotka, a zatem imgciąg jest traktowany jako sekwencja wejściowa. Jeśli ten ciąg ma 74 znaki, to Python widzi go jako 74 oddzielne wartości wiązania, każda o długości jednego znaku.

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

Jeśli uznasz to za łatwiejsze do odczytania, możesz również użyć literału listy:

cursor.execute('INSERT INTO images VALUES(?)', [img])
Martijn Pieters
źródło
38
Mamy wielu zaawansowanych programistów, którzy popełnili ten błąd, więc nie ma potrzeby czuć się głupio. :)
MrGumble
6
To też mnie ugryzło. Jeśli oszukają „zaawansowanych programistów”, oznacza to, że jest to nieintuicyjne. IMHO byłoby bardziej naturalne, gdyby metoda execute () pobierała pojedynczą wartość zamiast krotki o pojedynczej wartości, jeśli jest tylko jedna? w zapytaniu. W każdym razie dzięki za podpowiedź!
Laryx Decidua
5
@ user465139: %Operator on strwykonuje tego rodzaju magię - traktuje krotkę jako wiele wartości, ale str(lub jakikolwiek inny rodzaj iteracji) jako pojedynczą wartość. Ale to powoduje zamieszanie o wiele częściej niż je rozwiązuje, i dlatego prawie nic innego w standardowym katalogu standardowym nie próbuje tego rodzaju magii.
abarnert
używanie nie %sjest również zalecane ze względów bezpieczeństwa - docs.python.org/3/library/sqlite3.html
wesinat0r
2
cursor.execute(sql,array)

Przyjmuje tylko dwa argumenty.
Będzie iterować obiekt „tablica” i dopasować? w ciągu-sql.
(z kontrolą poprawności, aby uniknąć wstrzyknięcia sql)

Punnerud
źródło