Formato “% s”% vs formato “{0}”. Formato () vs formato “?”

En este post sobre SQLite , aaronasterling me dijo que

  • cmd = "attach \"%s\" as toMerge" % "b.db" : es incorrecto
  • cmd = 'attach "{0}" as toMerge'.format("b.db") : es correcto
  • cmd = "attach ? as toMerge"; cursor.execute(cmd, ('b.db', )) cmd = "attach ? as toMerge"; cursor.execute(cmd, ('b.db', )) : es lo correcto

Pero, he pensado que el primero y el segundo son lo mismo. ¿Cuáles son las diferencias entre esos tres?

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

Debes usar ' lugar de " , para que no tengas que escapar.

Usaste las cadenas de formato antiguas que están en desuso.

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

Esto utiliza la nueva característica de cadena de formato de las versiones más nuevas de Python que deben usarse en lugar de la anterior, si es posible.

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

Este omite el formato de cadena completamente y utiliza una función SQLite en su lugar, por lo que esta es la forma correcta de hacerlo.

Gran ventaja: no hay riesgo de inyección de SQL

El primero y el segundo producen el mismo resultado, pero se prefiere el segundo método para formatear cadenas en las versiones más nuevas de Python.

Sin embargo, el tercero es el mejor enfoque aquí porque utiliza parámetros en lugar de manipular cadenas. Esto es más rápido y más seguro.

Porque no se está escapando. Si reemplaza b.db con la entrada del usuario, lo dejaría vulnerable a la inyección de SQL.