2013-05-31 9 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() 

Nie mogę zrozumieć, dlaczego to daje mi błąd, Faktyczny ciąg, który próbuję wstawić, ma 74 znaki, to jest: "/ gifs/epic-fail -photos-there-i-fix-it-aww-man-the-tire-pressure-low.gif "sqlite3.ProgrammingError: podano niepoprawną liczbę powiązań. Bieżące oświadczenie używa 1, a jest 74 dostarczonych

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

Byłem w tym od wielu godzin i nie wiem, co się dzieje.

Odpowiedz

192

Trzeba zdać w sekwencji, ale zapomniałeś przecinka, aby parametry krotki:

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

Bez przecinka, (img) tylko pogrupowane wypowiedzi, nie krotką, a tym samym img ciąg traktowany jest jako sekwencja wejściowa. Jeśli ten ciąg ma 74 znaki, to Python widzi to jako 74 oddzielne wartości wiązania, każdy o długości jednego znaku.

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

Jeśli okaże się to łatwiejsze do odczytania, można również skorzystać z listy dosłowne:

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

Jesteśmy mnóstwo zaawansowanych koderów, które uczyniły ten błąd, więc nie trzeba czuć się głupio. :) – MrGumble

+1

To mnie też. Jeśli oszukują "zaawansowanych koderów", oznacza to, że jest to nieintuicyjne. IMHO byłoby bardziej naturalne, jeśli execute() wziął pojedynczą wartość zamiast jednej wartości krotki, jeśli jest tylko jedna? w zapytaniu. W każdym razie, dzięki za podpowiedź! –

+3

@ user465139: Operator '%' na 'str' robi tego rodzaju magię - traktuje krotkę jako wiele wartości, ale" str "(lub jakikolwiek inny rodzaj iteracji) jako pojedynczą wartość. Ale to powoduje zamieszanie znacznie częściej, niż rozwiązuje to, dlatego prawie nic innego w stdlibach nie próbuje tego rodzaju magii. – abarnert