Mysql
 sql >> Base de données >  >> RDS >> Mysql

Inclure les appels de fonction DB dans python MySQLdb executemany()

La méthode ci-dessous est loin d'être idéale, mais malheureusement, c'est la seule que je connaisse.

L'idée est de construire manuellement le SQL, en utilisant connection.literal pour échapper aux arguments pour vous :

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)

Cela a l'air horrible et peut vous donner la chair de poule, mais si vous regardez sous le capot (dans /usr/lib/pymodules/python2.6/MySQLdb/cursors.py) ce que MySQLdb fait dans cursors.executemany , je pense que cela va dans le même sens que ce que fait cette fonction, moins le mélange dû à la regex cursors.insert_values n'analyse pas correctement les parenthèses imbriquées. (eeh !)

Je viens d'installer oursql , une alternative à MySQLdb, et je suis heureux d'annoncer que

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

fonctionne comme prévu avec oursql.