Deaktivieren autocommit während Hunderte von MySQL UPDATE-Anweisungen in Django Programm
-
01-10-2019 - |
Frage
In einem Django-Programm, wie explizit deaktivieren Sie die automatische Transaktionsmanagement vor Hunderten von Updates und ermöglicht es, nachdem der UPDATEs beenden?
Ich sah in http://docs.djangoproject.com/en/ dev / Themen / db / Transaktionen / aber fanden keine Ahnung.
Ich habe versucht, den folgenden Code am Anfang
zu setzensettings.DISABLE_TRANSACTION_MANAGEMENT = True
Ich habe auch versucht,
cursor = connection.cursor()
cursor.execute('SET SESSION autocommit = 0;')
...
UPDATE
...
cursor.execute('SET SESSION autocommit = 1;')
Weder Methoden oben verbessert die Aktualisierungsgeschwindigkeit. Gibt es etwas falsch mit über Codes?
Lösung
from django.db import transaction
@transaction.commit_on_success
def my_function_that_does_thousands_of_updates():
# Do whatever you want here
transaction.set_dirty()
So können Sie laufen, was SQL Sie ausführen möchten, und dann auch nur begehen, wenn es keine Ausnahmen gibt. Die set_dirty () -Aufruf ist erforderlich, wenn Sie eine manuelle Cursor wie in Ihrem Beispiel verwenden, aber nicht erforderlich, wenn Sie nur die Django ORM verwenden (wenn ich mich nicht irre, das ist 1,2 Verhalten zumindest) <. / p>
Um die volle Kontrolle über die Transaktionen haben, können Sie den transaction.commit_manually Dekorateur verwenden. Was Ihre Geschwindigkeit Problem, kann ich nicht kommentieren.
Die django docs erklärt dies ziemlich gut: http://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.commit_on_success
Andere Tipps
Wenn Sie nur Hunderte von Updates und nicht Zehntausende tun, vielleicht die Geschwindigkeit Problem liegt nicht um die Daten zu schreiben, sondern weil es eher zu finden. das heißt vielleicht gibt es eine where-Klausel in der Update-Anweisung und es dauert eine Weile, die richtige Zeile zu Update zu finden. Wenn das der Fall ist, dann Autocommit Drehen nicht helfen würde - werden Sie einen Index auf dem Feld müssen in Ihrem where-Klausel
.Wie viele Zeilen sind in der Tabelle? Was bedeutet die Update-Anweisung aus?
Sie können auch vorbereitete Anweisungen versuchen, aber für unter tausend Updates sollte es nicht viel Unterschied machen.