Solución de problemas de sustitución de parámetros en SQLite
¿Tiene problemas al utilizar la sustitución de parámetros en SQLite3 con Python? Aquí hay una investigación en profundidad y una resolución.
En un intento de evitar inyecciones de SQL, la sustitución de parámetros usando '?' es aconsejable. Sin embargo, puede surgir un error al utilizar este enfoque. Por ejemplo, con el siguiente código:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item)
self.cursor.close()
Se produce el error "sqlite3.ProgrammingError: número incorrecto de enlaces proporcionados", lo que indica que la declaración especifica un enlace, mientras que se proporcionan ocho. Este problema surge de la creación inicial de la tabla de la base de datos. El módulo responsable de la creación de la base de datos contiene ocho enlaces, lo que provoca una falta de coincidencia.
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)""")
Irónicamente, sustituir '?' con un '%s' menos seguro se resuelve el problema:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item)
self.cursor.close()
La razón detrás de esta paradoja radica en la forma en que Cursor.execute() acepta su segundo parámetro. En lugar de una sola cadena, espera una secuencia, pero estás pasando una cadena de longitud ocho.
Para rectificar este problema, ajusta el código a lo siguiente:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])
Esta modificación garantiza que la sustitución de parámetros funcione según lo previsto. Asegúrese siempre de que el segundo parámetro pasado a Cursor.execute() corresponda al número especificado de enlaces en la instrucción SQL.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3