SQL 字符串替换错误格式字符串的参数不足
SQL string substitution error not enough arguments for format string
我正在尝试 return 查询以获取所有以字符串开头的记录,就像我拥有的变量一样
所以我这样做了:
"""select name from pos_order where name like '%s'||'%' order by id DESC limit 1"""%(darsh[0])
其中 darsh
是这样的 'mostafa/'
但它一直告诉我 not enough arguments for format string
不知道为什么。
有必要像 %%
那样用另一个 %
转义 %
"""select name from pos_order where name like '%s'||'%%' order by id DESC limit 1"""%(darsh[0])
但这是不好的做法,因为它打开了 SQL 注入的大门。当您使用 Psycopg 时,请使用 cursor.method
参数传递:
cursor.execute("""
select name
from pos_order
where name like %s||'%%'
order by id DESC
limit 1
""", (darsh[0],)
)
接受的答案中引用的绑定用于准备好的语句,这不是你的情况。
Python 尝试替换 sql 中的两个“%”字符。但它只有一个值——darsh[0]——可供使用。因此出现错误消息,它试图填写两个值,但你只给了它一个。
为了证明这一点,转义第二个 %%,使你的陈述
""""select name from pos_order where name like '%s'||'%%' order by id DESC limit 1"""%(darsh[0])
但是 不要这样做 - 它会让你容易受到 SQL 注入。例如,如果您的数据库中有一个名为 DO_BAD_THING 的函数,则恶意用户可以使用精心制作的输入字符串来执行该函数。
正确答案是使用绑定变量,请参阅此问题:
question about postgresql bind variables
有关如何执行此操作的示例。
强调一下 - 不要对 任何东西 使用 SQL 的字符串连接,最终用户可以在这些地方操作字符串。
我正在尝试 return 查询以获取所有以字符串开头的记录,就像我拥有的变量一样 所以我这样做了:
"""select name from pos_order where name like '%s'||'%' order by id DESC limit 1"""%(darsh[0])
其中 darsh
是这样的 'mostafa/'
但它一直告诉我 not enough arguments for format string
不知道为什么。
有必要像 %%
%
转义 %
"""select name from pos_order where name like '%s'||'%%' order by id DESC limit 1"""%(darsh[0])
但这是不好的做法,因为它打开了 SQL 注入的大门。当您使用 Psycopg 时,请使用 cursor.method
参数传递:
cursor.execute("""
select name
from pos_order
where name like %s||'%%'
order by id DESC
limit 1
""", (darsh[0],)
)
接受的答案中引用的绑定用于准备好的语句,这不是你的情况。
Python 尝试替换 sql 中的两个“%”字符。但它只有一个值——darsh[0]——可供使用。因此出现错误消息,它试图填写两个值,但你只给了它一个。
为了证明这一点,转义第二个 %%,使你的陈述
""""select name from pos_order where name like '%s'||'%%' order by id DESC limit 1"""%(darsh[0])
但是 不要这样做 - 它会让你容易受到 SQL 注入。例如,如果您的数据库中有一个名为 DO_BAD_THING 的函数,则恶意用户可以使用精心制作的输入字符串来执行该函数。
正确答案是使用绑定变量,请参阅此问题:
question about postgresql bind variables
有关如何执行此操作的示例。
强调一下 - 不要对 任何东西 使用 SQL 的字符串连接,最终用户可以在这些地方操作字符串。