2010-11-28 6 views
6

Ich muss eine Menge Daten in eine MySQL-Datenbank hochladen. Für die meisten Modelle verwende ich das ORM von django, aber eines meiner Modelle wird Milliarden (!) Von Instanzen haben und ich möchte seinen Einfügevorgang optimieren.Django: Mit benutzerdefinierten Raw SQL-Einfügungen mit Executemany und MySQL

Ich kann nicht scheinen, einen Weg zu finden, Executemany() Arbeit zu machen, und nach dem Googeln scheint es gibt es fast keine Beispiele da draußen.

ich für die richtige SQL-Syntax + korrekte Befehlssyntax + korrekten Werte Datenstruktur suchen einen executemany Befehl für die folgende SQL-Anweisung zu unterstützen:

INSERT INTO `some_table` (`int_column1`, `float_column2`, `string_column3`, `datetime_column4`) VALUES (%d, %f, %s, %s) 

Ja, ich besagt ausdrücklich die id (int_column1) für die Effizienz.

Ein kurzes Codebeispiel würde

Antwort

16

Hier ist eine Lösung, die executemany tatsächlich verwendet()!

Grundsätzlich funktioniert die Idee in dem Beispiel here.

Beachten Sie jedoch, dass Sie in Django den Platzhalter% s anstelle des Fragezeichens verwenden müssen.

Auch Sie möchten Ihre Transaktionen verwalten. Ich werde hier nicht näher darauf eingehen, da genügend Dokumentation vorhanden ist.

from django.db import connection,transaction 
cursor = connection.cursor() 



query=''' INSERT INTO table_name 
     (var1,var2,var3) 
     VALUES (%s,%s,%s) ''' 


queryList=buildQueryList() 

#here buildQueryList() represents some function to populate 
#the list with multiple records 
#in the tuple format (value1,value2,value3). 


cursor.executemany(query,queryList) 

transaction.commit() 
+0

ein halbes Jahr zu spät, aber endlich eine Antwort in Bezug auf Executemany() ausgegeben. Ich habe Ihre Antwort nicht getestet, akzeptiere sie aber und hoffe, dass Ihr Code funktioniert. – Jonathan

+0

Ich kann die Dokumentation für eine Funktion buildQueryList() nirgendwo finden. Gehört es zu Django? – Trindaz

+0

Wenn Sie die Kommentare lesen ...Es liegt an Ihnen, diese Funktion basierend auf den spezifischen Anforderungen Ihrer Anwendung/Datenbankschema zu erstellen ... #hier buildQueryList() repräsentiert eine Funktion zum Auffüllen #die Liste mit mehreren Datensätzen # im Tupelformat (Wert1, Wert2, Wert3). – jsh

1

ist serisouly groß sein, Milliarden von Zeilen (sorry Instanzen) von Daten über einige ORM Datenzugriffsschicht Laden darauf hindeutet, - wie lange haben Sie?

Bulk Load wenn möglich - http://dev.mysql.com/doc/refman/5.1/en/load-data.html

+0

Ich glaube, du verpasst, wo ich schrieb ich für die meisten Modelle ORM bin mit (die nur ein paar hundert Fälle) und rohe SQL für das einzelne Modell, die Milliarden von Instanzen hat, aber der Link ist hilfreich Danke – Jonathan

+0

Auch kann ich nicht wirklich laden-Daten, wie ich manipuliere die Daten, bevor ich es in die db ... – Jonathan

+0

Schließlich, ja, es ist so wichtig, auch wenn es ein paar Tage dauert, um die einfügen db. Es ist eine einmalige Operation (bis zum nächsten Mal ...) – Jonathan

1

Wenn Sie benötigen, um die Daten, Bulk-Ladung mit load data in eine temporäre Tabelle zu ändern, wie es ist. Wenden Sie dann Änderungen mit einem insert into select Befehl an. IME, das ist bei weitem der schnellste Weg, um viele Daten in eine Tabelle zu bekommen.

Verwandte Themen