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

16 投票
3 回答
18510 浏览
提问于 2025-04-16 04:01

在这篇关于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 个回答

3

因为这个没有被处理好。如果你把 b.db 替换成用户输入的内容,就会让你的程序容易受到 SQL 注入攻击。

6

第一种和第二种方法得到的结果是一样的,不过在新版的Python中,第二种方法更受欢迎,因为它在格式化字符串时更方便。

但是第三种方法更好,因为它使用了参数,而不是直接处理字符串。这样做不仅更快,而且更安全。

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注入的风险。

撰写回答