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

时间:2012-02-19 23:28:54

标签: python sql postgresql psycopg2

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

cursor.execute('SELECT * FROM %s', ("my_table", ))

我收到了这个错误:

psycopg2.ProgrammingError: syntax error at or near "'my_table'"
LINE 1: SELECT * FROM 'my_table'

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

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

cursor.execute('SELECT * FROM my_table')

1 个答案:

答案 0 :(得分:15)

我认为像这样的参数化语句应该与 values 一起使用,而不是与表名(或SQL关键字等)一起使用。所以你基本上没有运气了。

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

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

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

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

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