【问题标题】:"%s" % format vs "{0}".format() vs "?" format"%s" % 格式与 "{0}".format() 与 "?"格式
【发布时间】:2011-04-11 03:44:40
【问题描述】:

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

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

【问题讨论】:

  • 很抱歉没有在我的回答中澄清。它似乎已经太长了;)
  • @aaronasterling :哦,我只是觉得这篇文章可能值得一页。感谢您的回答和帮助。

标签: python string-formatting pysqlite


【解决方案1】:
"attach \"%s\" as toMerge" % "b.db"

你应该使用'而不是",这样你就不用逃跑了。

您使用了已弃用的旧格式字符串。

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

这使用了来自较新 Python 版本的新格式字符串功能,如果可能,应该使用该功能而不是旧版本。

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

这个完全省略了字符串格式,而是使用 SQLite 功能,所以这是正确的方法。

一大优势:没有 SQL 注入的风险

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 第二种方法,通过在较新版本的 python 中被首选,通过扩展,在支持它的 所有 版本的 python 中的新代码首选。这是一个简单的前向兼容性问题
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 2022-12-06
      相关资源
      最近更新 更多