Poniższa metoda jest daleka od ideału, ale niestety jest to jedyny sposób, jaki znam.
Pomysł polega na ręcznym konstruowaniu kodu SQL przy użyciu connection.literal
aby uciec od argumentów za ciebie:
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)
Wygląda to okropnie i może sprawić, że twoja skóra zacznie się czołgać, ale jeśli spojrzysz pod maskę (w /usr/lib/pymodules/python2.6/MySQLdb/cursors.py) na to, co MySQLdb robi w cursors.executemany , myślę, że jest to zgodne z tym, co robi ta funkcja, bez pomieszania z powodu wyrażenia regularnego
cursors.insert_values
niepoprawnie analizuje nawiasy zagnieżdżone. (eek!)
Właśnie zainstalowałem naszsql , alternatywa dla MySQLdb, i z przyjemnością informuję, że
sql='INSERT INTO `foo` (`fooid`,`data`,`time_added`) VALUES (?,?,NOW())'
cursor.executemany(sql,args)
działa zgodnie z oczekiwaniami z naszym SQL.