2012-02-19 62 views
4

当指定参数psycopg2在Python中的execute(),像这样:psycopg2 cursor.execute()的SQL查询参数会导致语法错误

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') 

回答

13

我相信,像这样的参数化的语句是为了与而不是表名(或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 

#1:让第三%s与另一个“%s”在这个时候进行更换,以使后续处理由psycopg2 #2:这是将被psycopg2正确报价,而不是放置在第三串'%s'原始字符串为

+0

非常好的详细答案,正是我需要的。谢谢! – 2012-02-25 23:33:07