open - sqlite3 python
Problema de sustitución de parámetros SQLite (7)
Usando SQLite3 con Python 2.5, estoy tratando de iterar a través de una lista y obtener el peso de un elemento de la base de datos basado en el nombre del elemento.
Intenté usar el "?" sustitución de parámetros sugerida para evitar inyecciones de SQL, pero no funciona. Por ejemplo, cuando uso:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item)
self.cursor.close()
Me sale el error:
sqlite3.ProgrammingError: Número incorrecto de enlaces suministrados. La instrucción actual usa 1, y hay 8 suministrados.
Creo que esto de alguna manera es causado por la creación inicial de la base de datos; el módulo que hice que realmente crea el DB tiene 8 enlaces.
cursor.execute("""CREATE TABLE Equipment
(id INTEGER PRIMARY KEY,
name TEXT,
price INTEGER,
weight REAL,
info TEXT,
ammo_cap INTEGER,
availability_west TEXT,
availability_east TEXT)""")
Sin embargo, cuando uso la sustitución "% s" menos segura para cada nombre de elemento, funciona bien. Al igual que:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ''%s''" % item)
self.cursor.close()
No puedo entender por qué cree que tengo 8 bindins cuando solo estoy llamando a uno. ¿Cómo puedo arreglarlo?
Citando (¿es eso lo que significan los parens?) ¿El? con parens parece funcionar para mí. Seguí intentando con (literalmente) ''?'' pero seguí recibiendo
ProgrammingError: Número incorrecto de enlaces suministrados. La instrucción actual usa 0 y hay 1 suministrada.
Cuando lo hice:
SELECCIONAR hecho DE factoids WHERE clave LIKE (?)
en lugar de:
SELECCIONAR hecho DE factoids WHERE key LIKE ''?''
Funcionó.
¿Es esto algo de Python 2.6?
El argumento de cursor.execute
que representa los valores que necesita insertar en la base de datos debe ser una tupla (secuencia). Sin embargo, considere este ejemplo y vea lo que está sucediendo:
>>> (''jason'')
''jason''
>>> (''jason'',)
(''jason'',)
El primer ejemplo se evalúa como una cadena; por lo que la forma correcta de representar la tupla de un solo valor es como en la segunda evaluación. De todos modos, el código a continuación para corregir su error.
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", (item,))
También dando los argumentos del valor cursor.execute
como cadenas, (que es lo que está haciendo) da como resultado la primera evaluación en el ejemplo y los resultados en el error que está recibiendo.
El método Cursor.execute()
espera una secuencia como segundo parámetro. Está suministrando una cadena que tiene 8 caracteres de largo.
Use el siguiente formulario en su lugar:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])
Referencia de la biblioteca Python 13.13.3: objetos del cursor sqlite3.
He pasado medio día tratando de descubrir por qué algo como esto me daría un error:
cursor.execute("SELECT * from ? WHERE name = ?", (table_name, name))
solo para descubrir que los nombres de tabla no se pueden parametrizar . Espero que esto ayude a otras personas a ahorrar algo de tiempo.
Tratar
execute("select fact from factoids where key like ?", "%%s%" % val)
No envuelve nada alrededor del ?
en absoluto, Python sqlite lo convertirá correctamente en una entidad entre comillas.
cada elemento de los elementos tiene que ser una tupla. asumiendo nombres se ve algo como esto:
names = [''Joe'', ''Bob'', ''Mary'']
debes hacer lo siguiente:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", (item, ))
al usar (item), lo convierte en una tupla en lugar de una cadena.
has probado esto? :
for item in self.inventory_names:
t = (item,)
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", t)
self.cursor.close()
cursor.execute () espera una secuencia (lista, tupla) como segundo parámetro. (-> ddaa)