sqlite3.ProgrammingError: Yanlış sayıda ciltleme sağlandı. Şu anki ifade 1'i kullanıyor ve 74 tane var


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

Bunun neden bana hata verdiğini anlayamıyorum, eklemeye çalıştığım gerçek dize 74 karakter uzunluğunda, bu: "/ gifs / epic-fail-photos-there-i-fixed-it-aww-man-the -tire-baskılar-low.gif"

Eklemeden önce str (dizi [cnt]) denedim, ama aynı sorun oluyor, veritabanı yalnızca bir METİN değeri olan bir sütun vardır.

Saatlerdir oradayım ve neler olduğunu anlayamıyorum.

Yanıtlar:


381

Bir sırayla geçmeniz gerekir, ancak parametrelerinizi bir demet haline getirmek için virgül unuttunuz:

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

Virgül olmadan, (img)bir grup değil, sadece gruplandırılmış bir ifadedir ve bu nedenle imgdize giriş dizisi olarak kabul edilir. Bu dize 74 karakter uzunluğundaysa, Python bunu her biri bir karakter uzunluğunda 74 ayrı bağlama değeri olarak görür.

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

Okumayı daha kolay bulursanız, liste hazır bilgisini de kullanabilirsiniz:

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

37
Biz bu hatayı yapan gelişmiş kodlayıcılarız, bu yüzden aptal hissetmeye gerek yok. :)
MrGumble

6
Bu da beni ısırdı. Eğer "gelişmiş kodlayıcılar" bununla kandırılırsa, bu sezgisel olmadığı anlamına gelir. IMHO, execute () yöntemi tek değerli bir demet yerine tek bir değer alsaydı daha doğal olurdu? tıklayın. Her neyse, ipucu için teşekkürler!
Laryx Decidua

5
@ user465139: %Operatör strbu tür bir sihir yapar - bir tupleı çoklu değerler olarak, ancak a str(veya başka türlü yinelenebilir) tek bir değer olarak ele alır. Ancak bu, çözdüğünden çok daha fazla karışıklığa neden olur, bu yüzden stdlib'de neredeyse hiçbir şey bu tür bir büyü denemez.
abarnert

%sgüvenlik endişeleri için de kullanılması önerilmez - docs.python.org/3/library/sqlite3.html
wesinat0r

2
cursor.execute(sql,array)

Sadece iki argüman alır.
"Dizi" yineleyecek ve eşleştirmek? sql-string içinde.
(sql enjeksiyonunu önlemek için akıl sağlığı kontrolleri ile)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.