2016-05-09 2 views
1

Ich entwickle Optimierungsalgorithmen, die mit Daten arbeiten, die in einer Postgres-Django-Datenbank gespeichert sind. Meine Algorithmen müssen die Objekte in der Datenbank wiederholt modifizieren und manchmal die vorgenommene Änderung rückgängig machen (es sind metaheuristische Algorithmen, für diejenigen, die es wissen). Das Problem ist, dass ich die Änderung in der Postgres-Datenbank während des Prozesses nicht speichern möchte. Ich möchte die Änderungen am Ende des Prozesses speichern, wenn ich mit den Ergebnissen der Optimierung zufrieden bin. Ich denke, dass die Lösung darin besteht, alle betroffenen Objekte in den Speicher zu laden, sie zu bearbeiten und die Objekte im Speicher am Ende in der Datenbank zu speichern.Arbeite an einer Django-Datenbank, ohne sie zu modifizieren

Allerdings scheint es schwieriger zu sein, als ich dachte ...

der Tat, wenn ich eine django Abfrage machen wird (dh. model1.objects.get oder model.objects.filter), ich fürchte, dass django die Objekte manchmal in der Datenbank aufrufen und manchmal in seinem Cache, aber ich bin mir ziemlich sicher, dass es in einigen Fällen nicht dasselbe sein wird wie die Instanzen, die ich manuell in den Speicher geladen habe (das sind diejenigen, auf denen ich arbeiten möchte, weil sie sich seit dem Laden aus der Datenbank geändert haben) ...

Gibt es eine Möglichkeit, solche Probleme zu umgehen?

Ich implementierte eine Art benutzerdefinierte Mini-Datenbank, die funktioniert, aber es wird zu schwierig zu warten und vor allem, ich denke, es ist nicht der einfachste und eleganteste Weg, um fortzufahren. Ich dachte, das betroffene Modell der Postgres-Datenbank in ein In-Memory-dump (für die Leistung) zu dumpen, arbeiten auf dieser In-Memory-db und beim Beenden meines Algorithmus, aktualisieren Sie die Daten der ursprünglichen Datenbank aus den Daten im Arbeitsspeicher Eins (es würde bedeuten, dass Django eine Verbindung, vielleicht durch die PK, der Originalobjekte mit denen in der In-Memory-Datenbank hält, um zu identifizieren, welche die gleichen sind und ich weiß nicht, ob es möglich ist).

Hat jemand einen Einblick?

Vielen Dank im Voraus.

Antwort

1

Was Sie suchen, ist Transaktionen. Eine der mächtigsten Funktionen eines RDBS. Verwenden Sie einfach START TRANSACTION, bevor Sie mit den Daten herumspielen. Am Ende, wenn Sie damit zufrieden sind, verwenden Sie COMMIT. Wenn Sie nicht möchten, dass Ihre Django-App die Änderungen sieht, verwenden Sie ROLLBACK.

Aufgrund der Standardtransaktionsisolationsstufe von postgresql wird Ihre django-Anwendung die Änderungen, die Sie an anderer Stelle vornehmen, nicht sehen, solange sie nicht festgeschrieben sind. Gleichzeitig werden Änderungen, die Sie in Ihrer SQL-Konsole oder mit anderem Code vornehmen, für diesen Code sichtbar, auch wenn er nicht festgeschrieben ist.

Read Committed ist die Standardisolationsstufe in PostgreSQL. Wenn eine -Transaktion diese Isolationsstufe verwendet, sieht eine SELECT-Abfrage (ohne eine FOR UPDATE/SHARE-Klausel) nur Daten, die vor Beginn der Abfrage festgeschrieben wurden. es sieht nie nicht festgeschriebene Daten oder Änderungen während Abfrage Ausführung durch gleichzeitige Transaktionen. Im Endeffekt sieht eine SELECT-Abfrage einen Snapshot der Datenbank ab dem Zeitpunkt, an dem die Abfrage zu gestartet wird. SELECT sieht jedoch die Auswirkungen von früheren Updates in seiner eigenen Transaktion ausgeführt, obwohl sie noch nicht festgeschrieben sind

+0

Vielen Dank! – Svan

+0

Sie sind herzlich willkommen.Da Sie hier noch neu sind, möchte ich darauf hinweisen, dass die bevorzugte Art, hier "Danke" zu sagen, darin besteht, gute Fragen und hilfreiche Antworten zu wählen (sobald Sie genug Ansehen haben) und die hilfreichste Antwort zu akzeptieren auf jede Frage, die Sie stellen (was auch Ihrem Ruf einen kleinen Schub verleiht). Bitte lesen Sie die [Über] Seite und auch [Wie stelle ich Fragen?] (Http://stackoverflow.com/help/how-to-ask) – e4c5

Verwandte Themen