sql >> Base de Datos >  >> RDS >> Mysql

Incluyendo llamadas a funciones de base de datos en python MySQLdb executemany()

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.