sql >> Base de Datos >  >> RDS >> PostgreSQL

psycopg2 cursor.execute() con el parámetro de consulta SQL provoca un error de sintaxis

Creo que las declaraciones parametrizadas como esta están destinadas a usarse con valores y no nombres de tablas (o palabras clave de SQL, etc.). Así que básicamente no tienes suerte con esto.

Sin embargo, no se preocupe, ya que este mecanismo está destinado a evitar la inyección de código SQL, y normalmente sabe a qué tabla desea acceder en el momento de escribir el código, por lo que hay pocas posibilidades de que alguien inyecte código malicioso. Simplemente continúe y escriba la tabla en la cadena.

Si, por alguna razón (posiblemente perversa), mantiene el nombre de la tabla paramétrico así:

  1. Si el nombre de la tabla proviene de su programa (por ejemplo, un diccionario o un atributo de clase), realice la sustitución de cadena habitual.
  2. Si el nombre de la tabla proviene del mundo externo (piense en "entrada del usuario"):no haga eso o confíe completamente en el usuario y aplique el enfoque anterior 1.

Por ejemplo:

cursor.execute(
    'SELECT * FROM %s where %s = %s'
    % ("my_table", "colum_name", "%s"), #1
    ("'some;perverse'string;--drop table foobar")) #2

#1 :Permita que el tercer %s sea reemplazado con otro '%s' en este momento, para permitir que psycopg2 lo procese más tarde#2 :Esta es la cadena que psycopg2 citará correctamente y colocará en lugar de ese tercer '%s' en la cadena original