我有这条线可以正常工作:
c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name)
但我想使用SQLite参数替换而不是字符串替换(因为我在这里看到这更安全).
这是我的(失败)尝试:
t = (name,) c.execute('select cleanseq from cleanseqs WHERE newID="?"',t)
但是这条线返回:
'提供的绑定数量不正确.当前语句使用0,并且有1个提供.
所以我的陈述的左边部分不起作用.我提供一个绑定(名称,在t)但似乎没有解析问号(?).如果我删除引用的引号,它就可以了.但我希望引号留在那里,因为我记得有些情况我需要它们.
所以问题是:我如何转换这一行:
c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name)
小智.. 20
对于那些喜欢我的人来说,发现这个帖子并且真的感到沮丧的是人们忽略了这样一个事实,即有时你不能忽略引号(因为你使用的是一个LIKE命令)你可以通过做一些事情来解决这个问题:
var = name + "%" c.execute('SELECT foo FROM bar WHERE name LIKE ?',(var,))
这将允许您在这种情况下替换通配符.
对于那些喜欢我的人来说,发现这个帖子并且真的感到沮丧的是人们忽略了这样一个事实,即有时你不能忽略引号(因为你使用的是一个LIKE命令)你可以通过做一些事情来解决这个问题:
var = name + "%" c.execute('SELECT foo FROM bar WHERE name LIKE ?',(var,))
这将允许您在这种情况下替换通配符.
我发现命名参数绑定样式更具可读性 - 并且sqlite3
支持它:
c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=:t', locals())
注意:传递{'t': t}
或dict(t=t)
代替locals()
将更加谨慎正确,但在我看来,当存在多个参数和/或更长的名称时,它会干扰可读性.无论如何,我确实发现:t
比...更好?
.
关于"""如果我删除引用的引号,它可以工作.但我希望引号保留在那里,因为我记得有些情况我需要它们.""
你自己构建整个SQL语句时所记得的是无关紧要的.
新的故事是:标记着?SQL语句中您想要替换值的每个位置然后传入一个包含每个值的元组? - 就这么简单; 包装器将引用任何字符串以确保它们是可接受的SQL常量.