【问题标题】:Django query syntax (must be string or read-only buffer, not tuple)Django 查询语法(必须是字符串或只读缓冲区,而不是元组)
【发布时间】:2015-10-07 11:38:33
【问题描述】:

我正在尝试进行选择

query = "select * from snmptt order by id desc limit %s", limit
cursorMYSQL.execute(query)

我从表单中得到限制

limit = form_limit.cleaned_data['limit']

我已经在插入中使用了这种语法(而不是 %)并且它起作用了,所以我不明白为什么它现在不起作用。

谢谢!

【问题讨论】:

  • 但是首先让我问你一个问题,为什么你在使用Django的时候要创建一个游标并手动执行这样一个简单的查询?
  • 如果你把它改成"select * from snmptt order by id desc limit %s" % limit会发生什么?
  • @cezar 使用"..." % limit 是个坏主意。它可能有效,但它不安全,并且容易受到 SQL 注入的攻击。
  • 什么意思?怎么会这样?
  • 这里的 cmets 并不是解释 SQL 注入的最佳场所,所以我建议你做一些研究。简而言之,如果不转义参数,则危险在于用户可以执行类似select * from snmptt order by id desc limit 5; drop table snmptt; 的操作。

标签: python mysql django


【解决方案1】:

查询和参数应该是执行方法的单独参数。

query = "select * from snmptt order by id desc limit %s"
params = [limit]
cursorMYSQL.execute(query, params)

【讨论】:

  • @cezar 如果你愿意,你可以在一行中完成整个事情,但我认为更长的版本更清晰,尤其是作为 Stack Overflow 的答案。
  • 我不小心删除了我之前的评论,而不是仅仅编辑它。是的,较长的版本更详细、更全面。顺便说一句,params 是一个元组不是更好吗?在文档中,我在准备好的语句中看到了元组。
  • 我认为无论您使用列表还是元组,实际上都没有任何区别。在这种只有一个参数的情况下,我使用了[limit],因为(limit,) 更清晰。
  • 我真的很喜欢长版,它更干净更清晰,但是,它也不起作用,我遇到了同样的错误。
  • 如果还是不行,请更新您的问题并添加完整的回溯,请同时发布limit 的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 2019-02-17
相关资源
最近更新 更多