Django-Batching / Bulk update_or_create?

9

Ich habe Daten in der Datenbank, die perido- ciell aktualisiert werden müssen. Die Quelle der Daten gibt alles zurück, was zu diesem Zeitpunkt verfügbar ist, und schließt neue Daten ein, die noch nicht in der Datenbank vorhanden sind.

Wenn ich die Quelldaten durchlaufe, möchte ich möglichst nicht 1000 einzelne Schreibvorgänge durchführen.

Gibt es etwas wie update_or_create , funktioniert aber in Stapeln?

Ein Gedanke verwendete update_or_create in Kombination mit manuellen Transaktionen, aber ich bin mir nicht sicher, ob das nur die einzelnen Schreibvorgänge in eine Warteschlange stellt oder ob es alles zu einem einzigen SQL-Einschub kombinieren würde.

Oder ähnlich könnte @commit_on_success() für eine Funktion mit update_or_create innerhalb einer Schleife arbeiten?

Ich mache nichts mit den Daten, außer es zu übersetzen und in einem Modell zu speichern. Nichts hängt von diesem Modell ab, das während der Schleife existiert.

    
binarysmacker 20.11.2014, 19:12
quelle

1 Antwort

1

Das Batching Ihrer Updates wird ein upsert Befehl sein und wie @imposeren gesagt hat, gibt Ihnen Postgres 9.5 diese Fähigkeit. Ich denke, Mysql 5.7 funktioniert auch (siehe Ссылка ), abhängig von Ihrem genaue Bedürfnisse. Das heißt, es ist wahrscheinlich am einfachsten, nur einen db-Cursor zu verwenden. Nichts falsch daran, es ist da für, wenn das ORM einfach nicht genug ist.

Etwas in dieser Richtung sollte funktionieren. Es ist pseudo-isch Code, also schneide es nicht einfach aus, aber das Konzept ist für dich da.

%Vor%

Annahmen sind hier:

  • db_results ist eine Art von Ergebnis-Iterator, entweder in einer Liste oder in einem Wörterbuch
  • Ein Ergebnis von db_results kann direkt in eine rohe sql exec-Anweisung
  • eingegeben werden
  • Wenn eine der Batch-Aktualisierungen fehlschlägt, werden ALLE zurückgerollt. Wenn Sie das für jeden Chunk verschieben möchten, drücken Sie einfach den with -Block ein wenig
Paul 21.04.2016 20:21
quelle

Tags und Links