“%s”%格式与“{0}”。format()vs“?”格式

时间:2010-09-11 17:45:16

标签: python string-formatting pysqlite

在这post about 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 个答案:

答案 0 :(得分: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注入的风险

答案 1 :(得分:6)

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

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

答案 2 :(得分:3)

因为它没有被转义。如果用用户输入替换b.db,则会使您容易受到SQL注入的攻击。<​​/ p>