SQL字符串替换错误格式字符串的参数不足

时间:2015-11-07 14:50:58

标签: python database postgresql psycopg2

我试图返回一个查询来获取所有以字符串开头的记录,就像我拥有的​​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

我不知道为什么。

2 个答案:

答案 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

有关如何执行此操作的示例。

强调 - 不要为最终用户可以操作字符串的任何使用字符串连接。