Verbesserung der Model.save()-Leistung von Django | Komentor

Wenn Sie in Ihrer Karriere jemals Django verwendet haben, müssen Sie mit dem Django ORM interagiert haben. Es ist eine großartige Software, die das Schreiben von Datenbanktabellen, das Setzen von Fremdschlüsseln und Indizes supereinfach gemacht hat.

Bei einem aktuellen Projekt ist mir aufgefallen, dass Member.save() zwei SQL-Abfragen ausführt, eine für UPDATE und eine für INSERT. Die beiden Abfragen wurden für dasselbe .save() ausgeführt, was überraschend war, da das Objekt zum ersten Mal erstellt wurde, sodass die UPDATE-Abfrage nicht vom ORM ausgeführt werden musste.

class Member(models.Model):
 mid = models.PrimaryKey(default=gen_mid)
    name = models.CharField(max_length=200)

Bei weiterer Überprüfung und Durchsicht der Dokumentation der Modellinstanz von Django stieß ich auf diese Zeile:

Wenn das Primärschlüsselattribut des Objekts auf einen Wert gesetzt ist, der True ergibt (dh ein anderer Wert als None oder die leere Zeichenfolge), führt Django ein UPDATE aus.
Wenn das Primärschlüsselattribut des Objekts nicht gesetzt ist oder wenn das UPDATE nichts aktualisiert hat (zB wenn der Primärschlüssel auf einen Wert gesetzt ist, der nicht in der Datenbank existiert), führt Django ein INSERT aus.

Da ich einen Standardwert für den Primärschlüssel des Mitgliedsmodells generierte, führte das ORM zuerst ein UPDATE aus (was fehlschlug) und dann ein INSERT in der Datenbank. Die Django-Dokumentation erläutert auch die Problemumgehung für dieses Problem

In einigen seltenen Fällen ist es notwendig, die Methode save() dazu zu zwingen, ein SQL INSERT auszuführen und nicht auf ein UPDATE zurückzugreifen. Oder umgekehrt: aktualisieren, wenn möglich, aber keine neue Zeile einfügen. In diesen Fällen können Sie die Parameter force_insert=True oder force_update=True an die Methode save() übergeben. Das Übergeben beider Parameter ist ein Fehler: Sie können nicht gleichzeitig einfügen und aktualisieren!

Das war es. Nur von Member.save() zu Member.save(force_insert=True) zu wechseln, als ich sicher war, dass ein neues Objekt erstellt wurde, änderte es von einer UPDATE- oder INSERT-Abfrage in nur eine INSERT-Abfrage. Genau das Verhalten, das ich erwartet hatte.

Django ist weiterhin ein fantastisches Web-Framework, dessen Dokumentation relevante Informationen enthält, die zu erheblichen Leistungssteigerungen führen können. Jemand, der mit Django anfängt, muss sich wahrscheinlich keine Gedanken über die Verwendung von force_insert oder force_update machen, und das ist das Schöne. Es funktioniert einfach!

Similar Posts

Leave a Reply

Your email address will not be published.