Il metodo seguente è tutt'altro che ideale, ma, sfortunatamente, è l'unico modo che conosco.
L'idea è di costruire manualmente l'SQL, usando connection.literal
per sfuggire agli argomenti per te:
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)
Sembra orribile e potrebbe farti accapponare la pelle, ma se guardi sotto il cofano (in /usr/lib/pymodules/python2.6/MySQLdb/cursors.py) cosa sta facendo MySQLdb in cursors.executemany
, penso che questo sia sulla stessa linea di quello che sta facendo quella funzione, meno il mix dovuto alla regex cursors.insert_values
non analizzando correttamente le parentesi nidificate. (eek!)
Ho appena installato oursql , un'alternativa a MySQLdb, e sono lieto di segnalarlo
sql='INSERT INTO `foo` (`fooid`,`data`,`time_added`) VALUES (?,?,NOW())'
cursor.executemany(sql,args)
funziona come previsto con oursql.