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

When using .format for psycopg2 it reads it as a column name but no issue using %

当使用 python 3 的 .format 与 psycopg2

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

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

我在这里错过了什么?

谢谢,

我注意到内部工作原理,但放置“{}”为我解决了这个问题。

使用 %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 以及 format()

中的常规字符串支持 %s 格式