Формат% 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', )) cmd = "attach ? as toMerge"; cursor.execute(cmd, ('b.db', )) : правильно

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

 "attach \"%s\" as toMerge" % "b.db" 

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

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

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

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

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

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

Большое преимущество: никакого риска SQL-инъекции

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

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

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