2009-06-17 18 views
10

tengo esta línea que funciona bien:SQLite parámetro de sustitución y cita

c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name) 

Pero quiero usar SQLite sustitución de parámetros en lugar en lugar de sustitución de cadenas (porque veo here que esto es más seguro).

Este es mi (no) Proveedores:

t = (name,) 
c.execute('select cleanseq from cleanseqs WHERE newID="?"',t) 

Pero esta línea devuelve:

'Número incorrecto de fijaciones suministrados. La instrucción actual usa 0, y hay 1 entregada. '

De modo que la parte izquierda de mi extracto no funciona. Estoy suministrando un enlace (nombre, en t) pero parece que el signo de interrogación (?) No está siendo analizado. Si borro las comillas que contienen el?, Funciona. Pero quiero que las citas permanezcan allí ya que recuerdo que hay casos en que las necesito.

Así que la pregunta es: ¿Cómo puedo convertir esta línea:

c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name) 
+0

Es genial usar parámetros, no es solo seguro, pero también mucho más rápido. Lea aquí: http://stackoverflow.com/questions/904796/how-do-i-get-around-the-problem-in-sqlite-and-c/926251#926251 – tuinstoel

Respuesta

9

sobre "" "Si elimino las cotizaciones sourronding el, que funciona, pero quiero las cotizaciones permanezcan allí desde recuerdo que hay casos en los que los necesitan. "" "

Lo que recuerdas de cuando construiste toda la declaración de SQL es irrelevante.

La nueva historia es: mark with a? cada lugar en la declaración de SQL donde desea que se sustituya un valor, luego pasa una tupla que contiene un valor por? -- Es así de simple; el contenedor cita cualquier cadena para asegurarse de que son constantes de SQL aceptables.

4

Pierde las comillas alrededor?

c.execute('select cleanseq from cleanseqs WHERE newID=?',(t,)) 

Lo está tratando como la cadena "?".

¿Necesita utilizar comillas dobles alrededor de toda la expresión, en lugar de solteros?

2

La biblioteca se encargará de citar y escaparse por usted. Simplemente escriba su consulta como la siguiente:?.

c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=?', (name,)) 
13

encuentro el estilo de encuadernación-parámetro llamado mucho más legible - y sqlite3 lo admite:

c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=:t', locals()) 

Nota: Pasar {'t': t} o dict(t=t) en lugar de locals() habría más escrupulosamente correcta, pero en mi opinión lo haría interferir con la legibilidad cuando hay varios parámetros y/o nombres más largos. En cualquier caso, encuentro el :t mejor que el ? ;-).

+0

+1 También hace que sea más fácil reutilizar una variable varias veces en la misma consulta, sin tener que volver a agregarla varias veces. – Martijn

18

Para cualquier persona que me gusta encontró este hilo y se frustró realmente por la gente que ignora el hecho de que a veces no puedes ignorar las comillas (porque estás usando decir un comando LIKE) puedes solucionar esto haciendo algo el efecto de:

var = name + "%" 
c.execute('SELECT foo FROM bar WHERE name LIKE ?',(var,)) 

Esto le permitirá sustituir en comodines en esta situación.

0

usuario regular

acabo de dar cuenta que usted tiene que hacer este manual utilizando el método no segura de cadena_sql = "otro surger sql aquí .. nombre de campo = \" "+ valor +" \ ";"

es la única forma en que lo analizará correctamente. usando SQLite para ganar ce. y bueno me dejo sin otra alternativa, solo escape sus valores antes de ponerlos en otra cosa, lo más probable es que termine con una triste base de datos de inyecciones sql: '(lol