2010-09-11 14 views
15

En este post about SQLite, aaronasterling me dijo que"% s"% formato vs "{0}". Formato() vs "?" Formato

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

Pero, he pensado en la primera y segundo son lo mismo. ¿Cuáles son las diferencias entre esos tres?

+0

lo siento por no aclarar en mi respuesta. Ya parecía demasiado largo;) – aaronasterling

+0

@aaronasterling: Ah, pensé que esta publicación podría valer una página. Gracias por las respuestas y la ayuda. – prosseek

Respuesta

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

Debe utilizar ' en lugar de ", por lo que no tiene que escapar.

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

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

Este sistema utiliza la nueva función de cadena de formato de las versiones más recientes de Python que se deben utilizar en lugar de la anterior si es posible.

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

Este omite por completo el formato de cadena y utiliza una característica SQLite en su lugar, por lo que esta es la forma correcta de hacerlo.

Gran ventaja: no hay riesgo de inyección SQL

3

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

6

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

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

+2

el segundo método, al ser preferido en las versiones más recientes de python es, por extensión, preferido para el nuevo código en _todas las versiones de python que lo soportan. Es una simple cuestión de compatibilidad directa – aaronasterling