sql >> Databasteknik >  >> RDS >> Mysql

Inkluderar DB-funktionsanrop i python MySQLdb executemany()

Metoden nedan är långt ifrån idealisk, men tyvärr är det det enda sättet jag vet.

Tanken är att manuellt konstruera SQL, med connection.literal för att undkomma argumenten åt dig:

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)

Det här ser hemskt ut och kan få din hud att krypa, men om du tittar under huven (i /usr/lib/pymodules/python2.6/MySQLdb/cursors.py) på vad MySQLdb gör i cursors.executemany , jag tror att detta är på samma sätt som vad den funktionen gör, minus mixupen på grund av regexet cursors.insert_values analyserar inte de kapslade parenteserna korrekt. (eek!)

Jag har precis installerat oursql , ett alternativ till MySQLdb, och jag rapporterar gärna det

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

fungerar som förväntat med oursql.




  1. Tabell anges två gånger både som mål för INSERT och som separat datakälla

  2. Hur räknar man förekomster i kommaseparerad kolumn?

  3. MySql Last Insert ID, Connector .net

  4. Kopiera tabell till en annan databas på en annan SQL Server