将 .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
格式
当使用 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
格式