Uso de pysqlite Estoy haciendo un procedimiento para hacer algo con algunos datos. El mismo tipo de operación se realiza en campos similares en varias tablas y columnas, así que pensé que podía parametrizar la instrucción SQL como se muestra a continuación:pysqlite: sustitución de marcadores de posición para nombres de columnas o tablas?
def foo():
column = 'c'
table = 't'
row = 1
# preferred approach, gives syntax error
c.execute('SELECT ? FROM ? WHERE id=?', (column, table, row))
# sanity check, works fine
c.execute('SELECT c FROM t WHERE id=?', (row))
# workaround, also works, but is this the right way?
c.execute('SELECT % FROM % WHERE id=?' % (column, table), row))
El error que consigo no es muy útil (sqlite3.OperationalError: near "?": syntax error
), pero entérate: Pysqlite no aprecia que los marcadores de posición se usen de esta manera.
¿Alguien puede señalar lo que está sucediendo aquí junto con la forma correcta de hacer lo anterior?
¿Esto es seguro desde la inyección SQL? – berkelem
@berkelem: es vulnerable a la inyección SQL. Desafortunadamente, debido a que los nombres de las columnas y las tablas no son parametrizables, no hay forma de evitar el formato de cadenas. [Usar listas blancas] (https://phpdelusions.net/sql_injection#whitelist) es una buena práctica aquí. – unutbu