【问题标题】:SQL string substitution error not enough arguments for format stringSQL 字符串替换错误 格式字符串的参数不足
【发布时间】:2015-11-07 14:50:57
【问题描述】:

我正在尝试返回一个查询以获取所有以字符串开头的记录,例如我拥有的变量 所以我这样做了:

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

我不知道为什么。

【问题讨论】:

  • 不要使用字符串操作将数据添加到查询中。请改用查询参数。
  • 没听懂?你什么意思?
  • 如果您使用的是 psycopg2:initd.org/psycopg/docs/… 尤其是几个屏幕下方的红色框。
  • @Colonel 虽然应该使用驱动程序参数传递机制而不是他自己的,但这不是反对的理由。此评论适用于未投反对票的任何人。
  • 你在使用 psycopg2 吗?

标签: python database postgresql psycopg2


【解决方案1】:

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 使用字符串连接。

【讨论】:

  • 感谢您的帮助:)
【解决方案2】:

有必要使用另一个% 来转义%,例如%%

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

接受的答案中引用的绑定用于准备好的陈述,这不是你的情况。

【讨论】:

  • 感谢您的帮助:)
猜你喜欢
  • 2018-09-21
  • 2017-09-28
  • 2019-07-23
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
相关资源
最近更新 更多