Dies ist nur eine Theorie, die ich basierend auf anderen Feedback und vielleicht ähnlichen Erfahrungen herausfinden möchte.Django SQLite testet Kuriosität: Unterschiedlicher Ausführungsweg?
Verwendung von mySQL zum Ausführen von Tests, aber natürlich ist eine In-Memory-SQLite-Datenbank viel schneller. Es scheint jedoch einige Probleme gegeben zu haben.
Wenn DATABASE_ENGINE
gesetzt django.db.backends.sqlite3
zu verwenden und ich laufe manage.py test
wird der Ausgang nicht wie erhofft:
(entfernt die meisten Linien, aber interessante Punkte des Scheiterns den Hinweis auf)
$ python manage.py test Traceback (most recent call last): File "manage.py", line 12, in execute_manager(settings) File "/Users/bartekc/.virtualenvs/xx/lib/python2.6/site-packages/django/core/management/__init__.py", line 438, in execute_manager utility.execute() File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 51, in class AcvTripIncentive(models.Model): # First interesting failure File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 55, in AcvTripIncentive trip = models.OneToOneField(Trip, limit_choices_to={'sites' : Site.objects.get(name='ZZ'), 'is_active' : True,}) # Next interesting failure File "/Users/bartekc/domains/xx/xx/associates/yyz/models.py", line 252, in current_site = Site.objects.get_current()
es mehrere sind Misserfolge wie das, aber nur ein paar hinweisen. Das Problem ist offensichtlich. Das Standortmodell enthält keine tatsächlichen Daten, aber die Dateien enthalten Code, der versucht, die aktuellen oder bestimmte Instanzen unter dem Standortmodell abzurufen.
Jetzt kann ich eine einfache Lösung denken: Das OneToOneField
sollte umgeschaltet werden, um eine Funktion mit limit_choices_to
zu verwenden, und die zweite gleich. Die Funktionen werden dann bei Bedarf aufgerufen, nicht beim ersten Scannen der Datei durch Django.
Meine eigentliche Frage ist jedoch: Warum passiert das mit SQLite und nicht mySQL?. Gibt es einen anderen Weg, den die beiden Datenbank-Engines durch Tests durchlaufen? Ich würde es nicht glauben, da Python das ganze kompilieren der Modelle macht.
Was genau passiert hier?
Prost.
Haben Sie bedenken, dass die sqlite-Datenbank bei jeder Ausführung der Tests neu erstellt und leer ist, während die mysql-Datenbank die gleiche ist, die Sie für Produktion/Entwicklung verwenden und bereits mehr Daten enthält? –
Die mySQL-Datenbank wird jedes Mal neu erstellt. – Bartek
Wo rufen Sie Site.objects.get_current() in Ihrem Modell auf? Ist es in der save() - Methode oder in einem Signal? –