"%s" % format vs "{0}".format() vs "?" format

16
在这篇有关SQLite的文章中,aaronasterling告诉我:
  • cmd = "attach \"%s\" as toMerge" % "b.db":是错误的
  • cmd = 'attach "{0}" as toMerge'.format("b.db"):是正确的
  • cmd = "attach ? as toMerge"; cursor.execute(cmd, ('b.db', )):是正确的事情
但是,我认为第一和第二个是相同的。这三者之间有什么区别?
3个回答

20
"attach \"%s\" as toMerge" % "b.db"

你应该使用'而不是",这样就不需要转义。

你使用了已经弃用的旧格式化字符串。

'attach "{0}" as toMerge'.format("b.db")

如果可能的话,应该使用较新版本 Python 中的新格式化字符串特性,而不是旧的格式化字符串。

"attach ? as toMerge"; cursor.execute(cmd, ('b.db', ))

这个方法完全省略了字符串格式化,而是使用了 SQLite 的一个特性,因此这是正确的方法。

最大的优点:没有 SQL 注入的风险


6
第一种和第二种方法都能得到相同的结果,但在Python的新版本中,第二种方法更受欢迎用于格式化字符串。
然而,在这里使用第三种方法是更好的选择,因为它使用参数而不是操作字符串。这样做既更快也更安全。

2
第二种方法在较新版本的Python中更受青睐,因此,在支持它的所有Python版本中,它也被推荐用于新代码。这只是一种简单的向前兼容性问题。 - aaronasterling

3

因为它没有被转义。如果你用用户输入替换b.db,那么你就容易受到SQL注入攻击。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接