Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Einschließen von DB-Funktionsaufrufen in Python MySQLdb executemany()

Die folgende Methode ist alles andere als ideal, aber leider ist dies die einzige Möglichkeit, die ich kenne.

Die Idee ist, das SQL manuell zu erstellen, indem connection.literal verwendet wird um den Argumenten für Sie zu entkommen:

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)

Das sieht schrecklich aus und kann Ihre Haut zum Kriechen bringen, aber wenn Sie unter die Haube (in /usr/lib/pymodules/python2.6/MySQLdb/cursors.py) schauen, was MySQLdb in cursors.executemany , denke ich, dass dies in die gleiche Richtung geht wie das, was diese Funktion tut, abzüglich der Verwechslung aufgrund der Regex cursors.insert_values die verschachtelten Klammern werden nicht korrekt analysiert. (eek!)

Ich habe gerade unser SQL installiert , eine Alternative zu MySQLdb, und freue mich, Ihnen das mitteilen zu können

sql='INSERT INTO `foo` (`fooid`,`data`,`time_added`) VALUES (?,?,NOW())'
cursor.executemany(sql,args)

funktioniert wie erwartet mit oursql.