2009-06-10 13 views
5

Ich benutze Python und sein MySQLdb-Modul, um einige Messdaten in eine MySQL-Datenbank zu importieren. Die Menge an Daten, die wir haben, ist ziemlich hoch (derzeit ca. 250 MB an CSV-Dateien und noch viel mehr).Python + MySQLdb Executemany

Derzeit verwende ich cursor.execute (...), um einige Metadaten zu importieren. Dies ist nicht problematisch, da es nur wenige Einträge für diese gibt.

Das Problem ist, dass wenn ich versuche, cursor.executemany() zu verwenden, größere Mengen der eigentlichen Messdaten zu importieren, MySQLdb ein

def __insert_values(self, values): 
    cursor = self.connection.cursor() 
    cursor.executemany(""" 
     insert into values (ensg, value, sampleid) 
     values (%s, %s, %s)""", values) 
    cursor.close() 

TypeError: not all arguments converted during string formatting 

Mein aktueller Code ist anhebt, wo values ist eine Liste von Tupeln mit jeweils drei Strings. Irgendwelche Ideen, was könnte daran falsch sein?

Edit:

Die Werte werden durch

yield (prefix + row['id'], row['value'], sample_id) 

und dann in eine Liste eintausend zu einem Zeitpunkt gelesen, wo Zeile und Iterator aus Richtung csv.DictReader.

+1

Haben Sie verifiziert, dass Werte die richtigen Daten enthalten? Nebenbei sollten Sie mit LOAD LOCAL DATA INFILE suchen. Es kann viel schneller sein. –

+0

Das Problem besteht darin, dass die Daten vorverarbeitet werden müssen (was derzeit im selben Python-Skript erfolgt), und es ist nicht sehr sinnvoll, redundante Kopien so großer Datensätze zu erstellen. Die Werte sollten in Ordnung sein, als ich das mit einem Debugger überprüft habe. – lhahne

Antwort

7

Im nachhinein war dies ein wirklich dummer bu Es ist schwer, Fehler zu erkennen. Values ​​ist ein Schlüsselwort in sql, sodass die Tabellennamewerte in Anführungszeichen gesetzt werden müssen.

def __insert_values(self, values): 
    cursor = self.connection.cursor() 
    cursor.executemany(""" 
     insert into `values` (ensg, value, sampleid) 
     values (%s, %s, %s)""", values) 
    cursor.close() 
3

Die Nachricht, die Sie erhalten, zeigt an, dass innerhalb der executemany() Methode eine der Konvertierungen fehlgeschlagen ist. Überprüfen Sie Ihre values Liste für ein Tupel länger als 3.

Für eine schnelle Überprüfung:

max(map(len, values)) 

Wenn das Ergebnis höher als 3 ist, suchen Sie schlecht Tupel mit einem Filter:

[t for t in values if len(t) != 3] 

oder, wenn Sie den Index benötigen:

[(i,t) for i,t in enumerate(values) if len(t) != 3] 
+0

Danke, aber das ist nicht das Problem. Alle Tupel haben die richtige Länge. – lhahne

+0

Nun, überprüfen Sie Ihr Format hat die richtige Anzahl von% s ... – gimel