带有SQL查询参数的psycopg2 cursor.execute()会导致语法错误

Rob*_*ark 6 python sql postgresql psycopg2

在Python中使用psycopg2中的execute()指定参数时,如下所示:

cursor.execute('SELECT * FROM %s', ("my_table", ))
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

psycopg2.ProgrammingError: syntax error at or near "'my_table'"
LINE 1: SELECT * FROM 'my_table'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?看起来psycopg2正在向查询添加单引号,这些单引号导致语法错误.

如果我不使用参数,它可以正常工作:

cursor.execute('SELECT * FROM my_table')
Run Code Online (Sandbox Code Playgroud)

Irf*_*rfy 15

我相信像这样的参数化语句意味着与而不是表名(或SQL关键字等)一起使用.所以你基本上没有运气了.

但是,请不要担心,因为此机制旨在防止SQL注入,并且您通常知道在代码编写时要访问哪个表,因此很可能有人可能会注入恶意代码.然后继续在字符串中写表.

如果,由于某些(可能是有悖常理的)原因,您保持表名参数如下:

  1. 如果表名来自您的程序(例如字典或类属性),则执行通常的字符串替换.
  2. 如果表名来自外部世界(想想"用户输入"):要么不这样做,要么完全信任用户并应用之前的方法1.

例如:

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

#1:让第三个%s在这个时候被另一个'%s'替换,以便以后通过psycopg2处理 #2:这是psycopg2正确引用的字符串,而不是原始字符串中的第三个'%s'