【问题标题】:SQLite parameter substitution and quotesSQLite 参数替换和引号
【发布时间】:2009-06-17 07:18:25
【问题描述】:

我的这条线可以正常工作:

c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name)

但我想使用 SQLite 参数替换而不是字符串替换(因为我看到 here 这样更安全)。

这是我的(失败的)尝试:

t = (name,)
c.execute('select cleanseq from cleanseqs WHERE newID="?"',t)

但是这一行返回:

'绑定数不正确 提供。当前语句使用 0,提供了 1 个。'

所以我的陈述的左边部分不起作用。我提供了一个绑定(名称,在 t 中),但似乎没有解析问号 (?)。如果我删除 ? 周围的引号,它会起作用。但我希望引号保留在那里,因为我记得在某些情况下我需要它们。

所以问题是:如何转换这一行:

c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name)

【问题讨论】:

标签: python sqlite


【解决方案1】:

库将为您处理引用和转义。只需像这样编写您的查询:

c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=?', (name,))

【讨论】:

    【解决方案2】:

    对于任何喜欢我的人都发现了这个线程并且因为人们忽略了一个事实而感到非常沮丧,有时你不能只是忽略引号(因为你正在使用说一个 LIKE 命令)你可以通过做一些事情来解决这个问题效果:

    var = name + "%"
    c.execute('SELECT foo FROM bar WHERE name LIKE ?',(var,))
    

    这将允许您在这种情况下替换通配符。

    【讨论】:

      【解决方案3】:

      我发现命名参数绑定样式更具可读性——sqlite3 支持它:

      c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=:t', locals())
      

      注意:传递{'t': t}dict(t=t) 而不是locals() 会更准确,但在我看来,当有多个参数和/或更长的名称时,它会影响可读性。无论如何,我确实发现:t? 更好;-)。

      【讨论】:

      • +1 它还可以更轻松地在同一个查询中多次重复使用变量,而无需多次重新添加。
      【解决方案4】:

      关于 """如果我删除 ? 附近的引号,它会起作用。但我希望引号保留在那里,因为我记得有些情况下我需要它们。"""

      当你自己构建整个 SQL 语句时,你记得什么是无关紧要的。

      新故事是:用 ? 标记SQL 语句中您希望替换值的每个位置,然后传入一个包含一个值的元组? ——就这么简单;包装器将引用任何字符串以确保它们是可接受的 SQL 常量。

      【讨论】:

        【解决方案5】:

        普通用户

        刚刚注意到您必须使用不安全的方法 sql_string = "other sql Surger here.. fieldname=\""+value+"\";" 来完成本手册

        这是正确解析它的唯一方法。 使用 SQLite 进行 win ce。好吧,我别无选择,只需在将它们放入之前转义你的值,否则你很可能最终会从 sql 注入中得到一个非常可悲的数据库:'( lol

        【讨论】:

          【解决方案6】:

          把 ? 周围的引号弄丢了?

          c.execute('select cleanseq from cleanseqs WHERE newID=?',(t,))
          

          它把它当作字符串“?”。

          您是否需要在整个表达式周围使用双引号,而不是单引号?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-09-18
            • 1970-01-01
            • 1970-01-01
            • 2012-02-16
            • 2019-07-01
            • 1970-01-01
            • 2010-11-21
            相关资源
            最近更新 更多