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', )): 是对的

但是,我认为第一个和第二个是相同的。这三者有什么区别?

4

3 回答 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 注入风险

于 2010-09-11T17:56:29.927 回答
6

第一种和第二种产生相同的结果,但第二种方法更适合在较新版本的 Python 中格式化字符串。

然而,第三种是更好的方法,因为它使用参数而不是操作字符串。这更快更安全。

于 2010-09-11T17:51:48.227 回答
3

因为它没有被逃脱。如果您将 b.db 替换为用户输入,那么您将容易受到 SQL 注入的攻击。

于 2010-09-11T17:47:47.473 回答