Al usar SQLite3 con Python 2.5, estoy tratando de recorrer una lista y obtener el peso de un elemento de la base de datos basado en el nombre del elemento.Problema de sustitución de parámetros SQLite
He intentado utilizar 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: Incorrect number of bindings supplied. The current statement uses 1, and there are 8 supplied.
Creo que esto es de alguna manera causada 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 se utiliza la sustitución del "% s" menos seguro para cada nombre del elemento, funciona muy bien. De esta manera:
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 enlaces cuando solo estoy llamando a uno. ¿Cómo puedo arreglarlo?
El número de columnas no es el número de enlaces. El número de "?" En la consulta es el número de enlaces. –
Sí, lo sé. Me imaginé que el código de alguna manera estaba tratando de usar los enlaces a los que hace referencia la sentencia "create table". No me di cuenta de que se refería a la cantidad de letras en el artículo en sí. – crystalattice