当前位置:  开发笔记 > 编程语言 > 正文

SQLite参数替换和引号

如何解决《SQLite参数替换和引号》经验,为你挑选了3个好方法。

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

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,))

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



1> 小智..:

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

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

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



2> Alex Martell..:

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

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

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



3> John Machin..:

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

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

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

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有