Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Incluindo chamadas de função de banco de dados em python MySQLdb executemany()


O método abaixo está longe de ser o ideal, mas, infelizmente, é a única maneira que conheço.

A ideia é construir manualmente o SQL, usando connection.literal para escapar dos argumentos para você:
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)

Isso parece horrível e pode fazer sua pele arrepiar, mas se você olhar sob o capô (em /usr/lib/pymodules/python2.6/MySQLdb/cursors.py) o que o MySQLdb está fazendo em cursors.executemany , acho que isso está na mesma linha do que essa função está fazendo, menos a confusão devido à regex cursors.insert_values não está analisando corretamente os parênteses aninhados. (eca!)

Acabei de instalar o oursql , uma alternativa ao MySQLdb, e estou feliz em informar que
sql='INSERT INTO `foo` (`fooid`,`data`,`time_added`) VALUES (?,?,NOW())'
cursor.executemany(sql,args)

funciona como esperado com oursql.