我试图返回一个查询来获取所有以字符串开头的记录,就像我拥有的varibale一样 所以我这样做:
"""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
我不知道为什么。
答案 0 :(得分:1)
有必要将%
与%
%%
一起转义
"""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],)
)
接受的答案中引用的约束用于准备好的陈述,而不是你的情况。
答案 1 :(得分:1)
Python尝试替换sql中的'%'字符。但它只有一个值 - darsh [0] - 可以使用。因此错误信息,它试图填写两个值,但你只给它一个。
要证明这一点,请转义第二个%%,发表声明
“”“从pos_order中选择名称,其中名称如'%s'||'%%'按ID排序DESC限制1”“”%(darsh [0])
但是 不要这样做 - 它使您容易受到SQL注入攻击。例如,如果您的数据库中有一个名为DO_BAD_THING的函数,则恶意用户可以使用精心设计的输入字符串执行该函数。
正确答案是使用绑定变量,请参阅此问题:
question about postgresql bind variables
有关如何执行此操作的示例。
强调 - 不要为最终用户可以操作字符串的任何使用字符串连接。