2008-11-25 20 views
5

Estoy tratando de averiguar qué hace exactamente la siguiente línea, específicamente la parte %% s?Pregunta de Newbie Python sobre cadenas con parámetros: "%% s"?

cursor.execute('INSERT INTO mastertickets (%s, %s) VALUES (%%s, %%s)'%sourcedest, (self.tkt.id, n)) 

Cualquier buen mini-tutorial sobre el formateo de cadenas y la inserción de variables en cadenas con Python?

+0

Esa es una pieza apestosa de código. ¿Dónde encontraste eso? Eso es algo que me gustaría evitar. –

+0

complemento mastertickets para trac – Epaga

+0

oh y por curiosidad ... estoy de acuerdo que no es muy legible (de ahí la pregunta;), pero ¿cómo debería uno hacerlo en su lugar? – Epaga

Respuesta

6

El %% se convierte en una sola %. Este código esencialmente hace dos niveles de formato de cadena. En primer lugar el %sourcedest se ejecuta para convertir su código esencialmente en:

cursor.execute('INSERT INTO mastertickets (BLAH, FOO) VALUES (%s, %s)', (self.tkt.id, n)) 

continuación, se aplica la capa de db los parámetros de las ranuras que quedan.

El doble% es necesario para hacer que las ranuras del DB pasen por la primera operación de formateo de cadenas de forma segura.

1

%% se convierte en un único%

4

"pero ¿cómo debería uno hacerlo en su lugar?"

Tough call. El problema es que están conectando metadatos (específicamente nombres de columnas) sobre la marcha en una declaración SQL. No soy un gran admirador de este tipo de cosas. La variable sourcedest tiene dos nombres de columna que se actualizarán.

Las probabilidades son buenas de que solo haya uno (o unos pocos) pares de nombres de columna que realmente se usen. Mi preferencia es hacer esto.

if situation1: 
    stmt= "INSERT INTO mastertickets (this, that) VALUES (?, ?)" 
elif situation2: 
    stmt= "INSERT INTO mastertickets (foo, bar) VALUES (?, ?)" 
else: 
    raise Exception("Bad configuration -- with some explanation") 
cursor.execute(stmt, (self.tkt.id, n)) 

Cuando hay más de una combinación válida de columnas para este tipo de cosas, indica que el modelo de datos se ha fusionado dos entidades en una sola tabla, que es un problema común de diseño de base de datos. Dado que está trabajando con un producto y un complemento, no hay mucho que pueda hacer sobre los problemas del modelo de datos.

3

Tener los nombres de columna insertados utilizando el formato de cadena no es tan malo, siempre que no sean proporcionados por el usuario. Los valores deben ser los parámetros de consulta aunque:

stmt = "INSERT INTO mastertickets (%s, %s) VALUES (?, ?)" % srcdest 
... 
cursor.execute(stmt, (self.tkt.id, n)) 
0

Se hace lo mismo:

cursor.execute('INSERT INTO mastertickets (%s, %s) VALUES (:%s, :%s)' % \ 
    tuple(sourcedest + sourcedest), dict(zip(sourcedest, (self.tkt.id, n)))) 

nunca lo hacen.

+0

oh no te preocupes. no lo haré o_O – Epaga