"% s" % format 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', )): правильная вещь

Но я думал, что первая и вторая одинаковы. Каковы различия между этими тремя?

Ответ 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.

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

Ответ 3

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