当使用.format for psycopg2时,它会将其作为列名称读取,但使用%时没有问题

时间:2015-10-06 10:58:51

标签: python sql psycopg2

使用python 3的.format和psycopg2

WHERE 
            US.UserId = UP.UserId AND
            UP.country = {2} 
            AND UP.state= {3} 
            AND UP.city= {4} 

它抱怨UP.country中的列'RSA'不存在。如果我在python 2中使用%s而不是我得到同样的问题而且它不会将其作为列读取。

我在这里缺少什么?

谢谢,

2 个答案:

答案 0 :(得分:0)

我注意到内部工作原理,但是'{}'围绕我解决了这个问题。

答案 1 :(得分:0)

%s用于带psycopg2的变量占位符。

确保正确传递参数,以便正确转义。

>>> cur.execute("INSERT INTO foo VALUES (%s)", ("bar",)) # correct

如果对用户输入使用%格式或format(),则易受SQL注入攻击。

>>> cur.execute("INSERT INTO foo VALUES (%s)" % "bar", ()) # wrong
>>> cur.execute("INSERT INTO foo VALUES ({} )".format("bar"), ()) # wrong

有关详细信息,请参阅passing parameters to SQL queries上的文档。

请注意,Python 3中的常规字符串支持%s格式,以及format()