"% 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-инъекций.