2011-05-20 17 views
5

Estoy intentando consultar mi sqlite3 db y usar los valores de una lista. Aquí está mi código:Python SQL Seleccione una declaración de una variable de lista?

for i in range(len(infolist)): 
    result = cursor.execute('SELECT COUNT(DISTINCT col1) 
           FROM tablename 
           WHERE col2 = ?', (infolist[i])) 

recibo este error:

ProgrammingError: 'Incorrect number of bindings supplied. The current statement uses 1, and there are 22 supplied.'

La cadena tiene 22 caracteres que explica por qué hay 22 enlaces. Claramente, no estoy pasando la cadena correctamente en la declaración de SQL.

+1

utilizando la cláusula 'IN', si la matriz se puede convertir en una lista separada por comas, trabajaría mejor y alivie la necesidad del ciclo. –

Respuesta

1

El segundo argumento para cursor.execute es una secuencia y le ha pasado una cadena (que es una secuencia de caracteres). Si intenta hacer una tupla de 1 elemento, necesita una coma. es decir, en lugar de ('item',)('item')

También debe iterar sobre los elementos y no utilizar gama y i:

for info in infolist: 
    result = cursor.execute('SELECT COUNT(DISTINCT col1) 
           FROM tablename 
           WHERE col2 = ?', (info,)) 
+0

Gracias por la información, ¿qué piensas sobre repetir varias listas, es decir. para i en rango (len (infolist)): \t \t cursor.execute ('UPDATE tabledata SET col1 = ?, col2 =? WHERE col3 =?', (infolist [i], infolist2 [i], infolist3 [i])) – user735304

+0

Esa es otra pregunta, pero 'cursor.executemany ('UPDATE tabledata SET col1 = ?, col2 =? WHERE col3 =?', Zip (inforlist, infolist2, infolist3))' es lo que quieres. – lambacck

0

es necesario agregar una coma para indicar la tupla tiene 1 elemento:

>>> ('abc') 
'abc' 
>>> ('abc',) 
('abc',) 

Trate de pasar a (infolist[i],)cursor.execute.

1

Necesita agregar una coma al final de (infolist[i]) ahora mismo es una cadena de 22 caracteres, no una tupla. (infolist[i],) debería arreglar eso

Cuestiones relacionadas