2009-03-24 4 views
0

Ich schrieb ein Programm, das ein Python-Programm ausgibt, die meine Django Anwendung mit Daten füllt. Dieses Programm ist jedoch 23 MB groß und mein Computer wird es nicht ausführen. Gibt es dafür eine Lösung?Füllen Django-Anwendung mit Daten mit sehr großen Python-Skript

Eine andere mögliche Lösung zum Füllen der Datenbank wäre ein Fixture. Das Problem ist, dass ich die neuen Primärschlüssel noch nicht kenne ... oder ich würde die alten benutzen müssen (was ich nicht bevorzuge).

Irgendwelche Vorschläge?

Der Grund für meinen Weg: Ich migriere eine Datenbank, die sich sehr von der neuen unterscheidet, es hat auch viele Beziehungen. Das 23-MB-Programm merkt sich alle Objekte aus der Quelldatenbank, weshalb es nicht einfach halbiert werden kann. Vielleicht gibt es einen besseren Weg, dies zu tun? Ich bevorzuge die Verwendung von Django als die Verwendung von Raw SQL.

+1

Können Sie ein Schnipsel dieses 23Mb-Programms veröffentlichen? –

+0

Ich sehe, dass der Code sehr ineffizient ist, Code-Size-weise. Ich versuche es mit Funktionen kleiner zu machen! –

+0

Können Sie erklären, warum Sie Ihre Daten in einen großen Stapel von Code umgewandelt haben, anstatt ein kleines Programm zu schreiben, um Ihre Daten zu lesen und Django-Modellobjekte zu erstellen? –

Antwort

1

In den meisten Fällen können Sie eine natürliche Hierarchie für Ihre Objekte finden. Manchmal gibt es eine Art "Master" und alle anderen Objekte haben Fremdschlüssel (FK) Referenzen auf diesen Master und auf einander.

In diesem Fall können Sie eine XML-ähnliche Struktur verwenden, wobei jedes Master-Objekt viele Unterobjekte enthält. In diesem Fall fügen Sie zuerst den Master ein, und alle untergeordneten Objekte haben FK-Referenzen auf ein vorhandenes Objekt.

In einigen Fällen gibt es jedoch Beziehungen, die nicht einfach FKs zu einem vorhandenen Objekt sein können. In diesem Fall haben Sie zirkuläre Abhängigkeiten und müssen (1) diese Abhängigkeit vorübergehend unterbrechen und (2) die Abhängigkeit neu erstellen, nachdem die Objekte geladen wurden.

Sie tun dies, indem Sie (a) Ihr Modell so definieren, dass es einen optionalen FK hat, (b) und einen temporären "natürlichen Schlüssel" als Referenz hat. Sie laden Daten ohne die richtige FK (es ist optional).

Dann, nachdem Ihre Daten geladen sind, gehen Sie zurück durch einen zweiten Durchlauf und fügen Sie alle fehlenden FK-Referenzen ein. Sobald dies erledigt ist, können Sie Ihr Modell modifizieren, um den FK obligatorisch zu machen.

Programm 1 - Export von der alten Datenbank in eine einfache Flat-Datei. CSV-Format oder JSON-Format oder etwas Einfaches.

for m in OldModel.objects.all(): 
    aDict = { 'col1':m.col1, 'old_at_fk':m.fktoanothertable.id, 'old_id':id } 
    csvwriter.writerow(aDict) 

Programm 2 - lesen einfache Flat-Datei; Erstellen Sie neue Datenbankmodellobjekte.

# Pass 1 - raw load 

for row in csv.reader: 
    new= NewModel.create(**row) 

# Pass 2 - resolve FK's 

for nm in NewModel.objects.all(): 
    ref1= OtherModel.objects.get(old_id=nm.old_at_fk) 
    nm.properfk = ref1 
    nm.save() 
+0

mit Pickle zum Lesen und Schreiben von Wörterbüchern sieht aus wie der einfachste Weg –

0

Ihr Computer würde es nicht ausführen, weil es ein großes Programm ist?

Vielleicht sollten Sie eine externe Datei oder Dateien verweisen, mit der ganzen Struktur, und dann werfen sie in der Datenbank, statt es in Ihrem Skript/Software zu schreiben ...

0

Setzen Sie die Daten in einem separaten Datei (oder Dateien). Schreiben Sie dann ein kleines Programm, das die Daten einliest und Ihre Datenbank über Django auffüllt.

0

Wenn ich Ihren Beitrag richtig lese, lesen Sie aus der alten Datenbank und schreiben ein "Python-Programm" basierend auf diesen Daten. Dies scheint mir der falsche Weg zu sein.

Mein Vorschlag wäre, eine formbare Version der alten Datenbank zu erstellen (XML würde dafür gut funktionieren), indem Sie die Daten aus der DB lesen, sie nach Bedarf modifizieren und dann in eine Datei ablegen.

Verwenden Sie diese formbare Version der Daten mit einem separaten Programm, um diese Daten über Ihre Django-Modelle in die neue Datenbank zu importieren.

Dies gibt Ihnen auch ein Maß an Flexibilität, wenn Sie diesen Prozess jemals duplizieren müssen.

Verwandte Themen