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í:
- 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.
- 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