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 的字符串连接,最终用户可以在这些地方操作字符串。