"% s"% формат против "{0}". format () против "?" формат - PullRequest
15 голосов
/ 11 сентября 2010

В этом сообщении о 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 ]

20 голосов
/ 11 сентября 2010
"attach \"%s\" as toMerge" % "b.db"

Вы должны использовать ' вместо ", чтобы вам не пришлось бежать.

Вы использовали старые строки форматирования, которые устарели.

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

При этом используется функция строки нового формата из более новых версий Python, которую следует использовать вместо старой, если это возможно.

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

Эта функция полностью исключает форматирование строки и использует вместо этого функцию SQLite, так что этоправильный способ сделать это.

Большое преимущество: нет риска внедрения SQL

6 голосов
/ 11 сентября 2010

Первый и второй приводят к одному и тому же результату, но второй метод предпочтителен для форматирования строк в более новых версиях Python.

Однако третий подход здесь лучше, поскольку он использует параметры вместо манипулирования строками. Это и быстрее, и безопаснее.

3 голосов
/ 11 сентября 2010

Потому что это не ускользнуло. Если вы замените b.db пользовательским вводом, это сделает вас уязвимым для SQL-инъекций.

...