El método a continuación está lejos de ser ideal, pero, desafortunadamente, es la única forma que conozco.
La idea es construir manualmente el SQL, usando connection.literal
para escapar de los argumentos por ti:
cursor=connection.cursor()
args=[(1,'foo'),(2,'bar')]
sql=('INSERT INTO `foo` (`fooid`,`data`,`time_added`) VALUES '
+','.join(
['(%s,%s,NOW())'%connection.literal(arg)
for arg in args]))
cursor.execute(sql)
Esto se ve horrible y puede poner la piel de gallina, pero si mira debajo del capó (en /usr/lib/pymodules/python2.6/MySQLdb/cursors.py) lo que está haciendo MySQLdb en cursors.executemany
, creo que esto está en la misma línea que lo que está haciendo esa función, menos la confusión debido a la expresión regular cursors.insert_values
no analizar correctamente los paréntesis anidados. (¡Eek!)
Acabo de instalar oursql , una alternativa a MySQLdb, y me complace informar que
sql='INSERT INTO `foo` (`fooid`,`data`,`time_added`) VALUES (?,?,NOW())'
cursor.executemany(sql,args)
funciona como se esperaba con oursql.