2015-11-07 39 views
-1

我试图返回查询得到与像varibale字符串开头的所有记录我有 ,所以我这样做:SQL字符串替换错误没有足够的论据格式字符串

"""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

请勿使用字符串操作将数据添加到查询中。改用查询参数。 –

+0

没有得到它?你什么意思 ? –

+0

如果您使用的是psycopg2:http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries特别是红色框中的一些屏幕。 –

回答

1

Python试图在SQL中替换'%'字符。但它只有一个值 - darsh [0] - 才能使用。因此,错误消息,它试图填写两个值,但你只给它一个。

为了证明这一点,躲过第二%%,使您的发言

“” “选择pos_order name其中name LIKE '%s' 的|| '%%' ORDER BY ID DESC极限1” “” %(darsh [0])

不要做到这一点 - 它会让你容易受到SQL注入。例如,如果数据库中有一个名为DO_BAD_THING的函数,恶意用户可以使用精心设计的输入字符串来执行该函数。

正确的答案是使用绑定变量,看这个问题:

question about postgresql bind variables

有关如何做到这一点的例子。

对于强调 - 不要使用字符串连接的SQL 任何东西其中最终用户可以操纵字符串。

+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],) 
) 

的绑定引用公认的答案被用于准备语句这是不是你的情况。

+0

谢谢你有帮助:) –

相关问题