SQLite参数替换和引号

Blo*_*nor 11 python sqlite

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

c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name)
Run Code Online (Sandbox Code Playgroud)

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

这是我的(失败)尝试:

t = (name,)
c.execute('select cleanseq from cleanseqs WHERE newID="?"',t)
Run Code Online (Sandbox Code Playgroud)

但是这条线返回:

'提供的绑定数量不正确.当前语句使用0,并且有1个提供.

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

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

c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name)
Run Code Online (Sandbox Code Playgroud)

小智 20

对于那些喜欢我的人来说,发现这个帖子并且真的感到沮丧的是人们忽略了这样一个事实,即有时你不能忽略引号(因为你使用的是一个LIKE命令)你可以通过做一些事情来解决这个问题:

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

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


Ale*_*lli 14

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

c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=:t', locals())
Run Code Online (Sandbox Code Playgroud)

注意:传递{'t': t}dict(t=t)代替locals()将更加谨慎正确,但在我看来,当存在多个参数和/或更长的名称时,它会干扰可读性.无论如何,我确实发现:t比...更好?.


Joh*_*hin 10

关于"""如果我删除引用的引号,它可以工作.但我希望引号保留在那里,因为我记得有些情况我需要它们.""

你自己构建整个SQL语句时所记得的是无关紧要的.

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