2012-07-17 32 views
6

Estoy tratando de crear una declaración mysql reutilizable para actualizar desde un diccionario donde las claves son los campos de la base de datos y los datos para entrar en ese campo es el valor asociado en el diccionario. Esto fue fácil al crear una función para insertar en mysql porque solo involucraba dos listas. Ahora, necesito separar las listas.¿Cómo actualizar mysql con python donde los campos y las entradas son de un diccionario?

Aquí es con lo que tengo que trabajar.

fields = self.dictionary.keys() 
vals = self.dictionary.values() 

stmt = "UPDATE TABLE table_name SET %s = '%s'" %(.join(fields), .join(vals))" 

Esto da salida a una instrucción como:

UPDATE TABLE table_name SET column1, column2 = ('value1','value2') 

lo necesito para dar salida a formato estándar para la actualización de una tabla como:

UPDATE table_name SET column1=value1, column2=value2 

Respuesta

8

Usted no quiere estar poniendo literal valores en el uso de la interpolación de cadenas: los ataques de inyección SQL son no es una buena cosa (tm). En cambio, usa la sintaxis del marcador de posición relevante para su base de datos (creo que MySQL es '% s').

Nota: Estoy usando .format aquí, el cambio de usar% si se quiere, pero escapar ninguna% 's

d = {'col1': 'val1', 'col2': 'val2'} 
sql = 'UPDATE table SET {}'.format(', '.join('{}=%s'.format(k) for k in d)) 
print sql 
# 'UPDATE table SET col2=%s, col1=%s' 

Suponiendo cur es un cursor DB la forma correcta de realizar la consulta es :

cur.execute(sql, d.values()) 

Esto funciona porque aunque el ordenamiento de un diccionario es efectivamente un orden arbitrario, el orden de las llaves/valores de un diccionario será constante tal que dict(zip(d.keys(), d.values())) == d.

0

la forma de tratar

stmt = "UPDATE TABLE table_name SET " 
for k,v in di.items(): 
    stmt += "%s = %s, " %(k,v) 

stmt = stmt[-2:] 
Cuestiones relacionadas