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 setzen
settings.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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top