135 Stimmen

Wie kann man die Testdatenbank von Django nur im Speicher ausführen?

Meine Django-Unit-Tests benötigen viel Zeit zum Ausführen, also suche ich nach Möglichkeiten, das zu beschleunigen. Ich erwäge die Installation eines SSD aber ich weiß, dass das auch seine Nachteile hat. Natürlich gibt es Dinge, die ich mit meinem Code machen könnte, aber ich suche nach einer strukturellen Lösung. Selbst das Ausführen eines einzelnen Tests ist langsam, da die Datenbank jedes Mal neu erstellt/nach Süden migriert werden muss. Also hier ist meine Idee...

Da ich weiß, dass die Testdatenbank immer recht klein sein wird, warum kann ich das System nicht einfach so konfigurieren, dass immer die gesamte Testdatenbank im RAM gehalten wird? Die Festplatte wird überhaupt nicht berührt. Wie kann ich das in Django konfigurieren? Ich würde es vorziehen, weiterhin mit MySQL da ich das in der Produktion verwende, aber wenn SQLite 3 oder etwas anderes macht dies einfach, ich würde diesen Weg gehen.

Verfügen SQLite oder MySQL über eine Option zur vollständigen Ausführung im Speicher? Es sollte möglich sein, eine RAM-Disk zu konfigurieren und dann die Testdatenbank so zu konfigurieren, dass sie ihre Daten dort speichert, aber ich bin mir nicht sicher, wie ich Django/MySQL anweisen kann, ein anderes Datenverzeichnis für eine bestimmte Datenbank zu verwenden, zumal es bei jedem Lauf gelöscht und neu erstellt wird. (Ich bin auf einem Mac FWIW.)

4voto

neves Punkte 25455

Ein anderer Ansatz: eine weitere Instanz von MySQL läuft in einem tempfs, das eine RAM-Disk verwendet. Anweisungen in diesem Blog-Beitrag: Beschleunigung von MySQL für Tests in Django .

Vorteile:

  • Sie verwenden genau dieselbe Datenbank, die auch Ihr Produktionsserver verwendet.
  • Sie müssen Ihre Standard-Mysql-Konfiguration nicht ändern

2voto

Alvin Punkte 2523

In Erweiterung der Antwort von Anurag habe ich den Prozess vereinfacht, indem ich dieselben test_settings erstellt und Folgendes zu manage.py hinzugefügt habe

if len(sys.argv) > 1 and sys.argv[1] == "test":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.test_settings")
else:
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

scheint sauberer zu sein, da sys bereits importiert ist und manage.py nur über die Kommandozeile verwendet wird, so dass die Einstellungen nicht überladen werden müssen

-1voto

Ehsan Barkhordar Punkte 2994

Verwenden Sie unten in Ihrem setting.py

DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X