Wie "bulk update" mit Django?
Möchte ich zum aktualisieren einer Tabelle mit Django - so etwas wie dieses im raw-SQL:
update tbl_name set name = 'foo' where name = 'bar'
Mein erstes Ergebnis ist so etwas wie das - aber das ist böse, nicht wahr?
list = ModelClass.objects.filter(name = 'bar')
for obj in list:
obj.name = 'foo'
obj.save()
Gibt es eine elegantere Möglichkeit?
Vielleicht suchen Sie nach batch einfügen. Werfen Sie einen Blick auf stackoverflow.com/questions/4294088/...
Ich weiß nicht, wie das einfügen neuer Daten - aktualisieren vorhandener.
Vielleicht mit Hilfe von select_for_update? docs.djangoproject.com/en/dev/ref/models/querysets/...
Was ist Sie nicht böse über die
Ich weiß nicht, wie das einfügen neuer Daten - aktualisieren vorhandener.
Vielleicht mit Hilfe von select_for_update? docs.djangoproject.com/en/dev/ref/models/querysets/...
Was ist Sie nicht böse über die
ModelClass
Ansatz? Dann füttern Sie zu Django: stackoverflow.com/questions/16853649/...InformationsquelleAutor Thomas Schwärzl | 2012-09-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
UPD
Django 2.2-version hat jetzt einen bulk_update.
Beziehen sich auf die folgenden django-Dokumentation Abschnitt
Kurz gesagt, Sie sollten in der Lage sein zu verwenden:
Können Sie auch
F
Objekte, Dinge zu tun, wie das Inkrementieren Zeilen:Finden Sie in der Dokumentation: https://docs.djangoproject.com/en/1.9/topics/db/queries/
Beachten Sie jedoch, dass:
ModelClass.save
Methode (also, wenn Sie eine gewisse Logik drin, wird nicht ausgelöst).save()
,DateTimeField
Felder mitauto_now=True
("geändert" - Spalten) nicht aktualisiert werden.Aber
ModelClass.objects.filter(name = 'bar').update(name="foo")
nicht erfüllen Zweck von bulk-update, wenn ich unterschiedliche Daten für unterschiedliche ids, die, wie könnte ich das tun, ohne dass mit Schleife ?Ich bin mir nicht sicher, ob ich dich Recht, aber ich fügte hinzu, Beispiel für die Antwort.
haben Sie keine Lösung gefunden, die für Ihren Fall noch ? Ich bin auch mit dem gleichen Szenario .
F-Objekte können nicht verwendet werden, um auf verschiedene Modelle der .update-Methode... zum Beispiel können Sie nicht verwenden
Entry.objects.all().update(title=F('blog__title'))
. Docs haben eine kleine Erwähnung dieser. Wenn Sie möchten, ziehen Sie Daten von einem anderen Modell zu aktualisieren Sie Ihre Eingaben, Sie müssen laufen eine for-SchleifeInformationsquelleAutor jb.
Erwägen Sie die Verwendung
django-bulk-update
gefunden hier auf GitHub.Installieren:
pip install django-bulk-update
Implementieren: (der code stammt direkt aus Projekten ReadMe-Datei)
Update: Als Marc Punkte in die Kommentare, dies ist nicht geeignet für die Aktualisierung Tausende von Zeilen auf einmal. Obwohl es ist geeignet für kleinere Mengen (10 bis 100 Jahren. Die Größe des Stapels, das für Sie das richtige ist, hängt von Ihrer CPU und der Komplexität der Abfrage. Dieses tool ist mehr wie eine Schubkarre, als ein Muldenkipper.
guter Punkt. Ich fand viele Entwickler die Verwendung von externen Bibliotheken, ohne zu wissen, Ihre Auswirkungen
Ich bin nicht einverstanden, dass bulk-update ist nicht wertvoll und nur wirklich notwendig, wenn Tausende von Aktualisierungen erforderlich sind. Mit es zu tun 10.000 Zeilen auf einmal ist nicht ratsam, die Gründe, die Sie erwähnt, aber es zu aktualisieren, 50 Zeilen auf einmal ist viel effizienter als das schlagen der db mit 50 separaten update-Anfragen.
Die besten Lösungen, die ich gefunden sind: a) die Verwendung von @Transaktion.atomic-decorator, die verbessert die Leistung durch die Verwendung einer einzigen Transaktion, oder b) machen Sie einen bulk-insert in eine temporäre Tabelle und dann ein UPDATE aus der temporären Tabelle an das original.
Ich weiß, dies ist ein Alter thread, aber eigentlich CASE/WO ist nicht der einzige Weg. Für PostgreSQL gibt es andere Ansätze, aber Sie sind DB-spezifisch, z.B. stackoverflow.com/a/18799497 Jedoch bin ich nicht sicher, ob dies möglich ist in ANSI-SQL
InformationsquelleAutor nu everest
Django 2.2-version hat jetzt einen
bulk_update
Methode (release notes).https://docs.djangoproject.com/en/dev/ref/models/querysets/#bulk-update
Beispiel:
InformationsquelleAutor velis
Wenn Sie wollen legen den gleichen Wert auf eine Sammlung von Zeilen, können Sie die update () - Methode in Kombination mit jedem Suchbegriff auf " alle aktualisieren von Zeilen in einer Abfrage:
Wenn Sie wollen update eine Sammlung von Zeilen mit unterschiedlichen Werten abhängig von einer Bedingung, Sie kann im besten Fall die batch-updates entsprechend zu Werten. Lassen Sie uns sagen, Sie haben 1000 Zeilen, wo Sie wollen, um eine Spalte zu einer der X-Werte, dann könnten Sie bereiten die Chargen vorher und dann nur X-update-queries (die jeweils im wesentlichen mit der form das erste Beispiel oben) + die erste SELECT-Abfrage.
Wenn jede Zeile benötigt einen eindeutigen Wert es gibt keine Möglichkeit zu vermeiden, eine Abfrage pro update. Schau vielleicht mal in anderen Architekturen wie CQRS/Event-sourcing, wenn Sie Ihre Leistungsfähigkeit in diesem letzteren Fall.
InformationsquelleAutor Andreas Bergström