我有这条线可以正常工作:
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)
答案 0 :(得分:18)
对于那些喜欢我的人发现这个帖子并且被人们忽视了这样一个事实感到非常沮丧,有时候你不能忽略引号(因为你正在使用说LIKE命令),你可以解决这个问题。做一些事情:
var = name + "%"
c.execute('SELECT foo FROM bar WHERE name LIKE ?',(var,))
这将允许您在这种情况下替换通配符。
答案 1 :(得分:14)
我发现命名参数绑定样式更具可读性 - sqlite3
支持它:
c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=:t', locals())
注意:传递{'t': t}
或dict(t=t)
代替locals()
会更加谨慎,但在我看来,当有多个参数和/或更长的名称时,它会干扰可读性。无论如何,我确实发现:t
比?
更好; - )。
答案 2 :(得分:10)
关于“”“如果我删除引用的引号,它可以工作。但我希望引号保留在那里,因为我记得有些情况我需要它们。”“”
当你自己构建整个SQL语句时,你所记得的是无关紧要的。
新故事是:标记着? SQL语句中您想要替换值的每个位置然后传入一个包含每个值的元组? - 就这么简单;包装器将引用任何字符串以确保它们是可接受的SQL常量。
答案 3 :(得分:4)
丢失报价?
c.execute('select cleanseq from cleanseqs WHERE newID=?',(t,))
它将它视为字符串“?”。
你是否需要在整个表达式中使用双引号而不是单数?
答案 4 :(得分:2)
图书馆将为您处理报价和转义。只需编写如下查询:
c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=?', (name,))
答案 5 :(得分:0)
刚刚注意到你必须使用sql_string ="其他sql surger这里的不安全方法来完成本手册.. fieldname = \"" + value +&# 34; \&#34 ;;"
它是您正确解析它的唯一方法。 使用SQLite获胜。并且让我没有其他选择,只是在将它们放入其他地方之前逃避你的价值观你很可能最终得到一个非常悲伤的数据库来自sql注入:'(lol