%s" %格式 vs "{0}".format() vs "?"格式
在这篇关于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注入的风险。