2017-10-01 3 views
0

Fragen, ob jemand anderes frustrierendes Verhalten bei Django-Migrationen erlebt. Ich habe einige verwandte Beiträge zu SO angeschaut, aber ich habe nichts gefunden, was dies spezifisch angeht.Django-Migrationen mit neuer Datenbank fehlgeschlagen

Das passiert mir immer, und es muss ein häufiges Szenario sein, also was fehlt mir?

Mein Szenario:

  1. Liste item
  2. ich eine Django-Anwendung erstellt haben, mit SQLite auf meinem lokalen Rechner Iterieren
  3. ich jetzt auf eine Produktion Postgresql db (AWS oder anderswo bereitstellen möchten)
  4. ich meine neue Datenbank eingerichtet, es auf meine Einstellungen hinzufügen und python manage.py migrate
  5. ich einen SQL-Fehler mir zu sagen, laufen, dass einer meiner Modell Tabellen existiert nicht. Duh! Deshalb laufe ich migrieren.
  6. ich am Ende mit Tabellen von Hand zu machen, tun seltsame Dinge wie python manage.py migrate <app_name> --fake, die mit Paketen weitere Probleme schafft wie simple_history

Ich bin sicher, es muss eine offensichtliche Antwort sein - was soll ich tun, um Datenbankschema in einer brandneuen, sauberen Datenbank einrichten?


EDIT: Traceback der Fehler Ich erhalte:

Wenn ich python manage.py migrate auf einer leeren Datenbank ausführen, ich folgende Fehlermeldung erhalten:

(banzai-platform-django) ➜ src git:(master) ✗ ./manage.py migrate 
Traceback (most recent call last): 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
psycopg2.ProgrammingError: relation "events_event" does not exist 
LINE 1: ...ents_event"."created", "events_event"."slug" FROM "events_ev... 
                  ^


The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
    File "./manage.py", line 22, in <module> 
    execute_from_command_line(sys.argv) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/core/management/__init__.py", line 363, in execute_from_command_line 
    utility.execute() 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/core/management/__init__.py", line 355, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/core/management/base.py", line 283, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/core/management/base.py", line 327, in execute 
    self.check() 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/core/management/base.py", line 359, in check 
    include_deployment_checks=include_deployment_checks, 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/core/management/commands/migrate.py", line 62, in _run_checks 
    issues.extend(super(Command, self)._run_checks(**kwargs)) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/core/management/base.py", line 346, in _run_checks 
    return checks.run_checks(**kwargs) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/core/checks/registry.py", line 81, in run_checks 
    new_errors = check(app_configs=app_configs) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/core/checks/urls.py", line 16, in check_url_config 
    return check_resolver(resolver) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/core/checks/urls.py", line 26, in check_resolver 
    return check_method() 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/urls/resolvers.py", line 254, in check 
    for pattern in self.url_patterns: 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/utils/functional.py", line 35, in __get__ 
    res = instance.__dict__[self.name] = self.func(instance) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/urls/resolvers.py", line 405, in url_patterns 
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/utils/functional.py", line 35, in __get__ 
    res = instance.__dict__[self.name] = self.func(instance) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/urls/resolvers.py", line 398, in urlconf_module 
    return import_module(self.urlconf_name) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/importlib/__init__.py", line 126, in import_module 
    return _bootstrap._gcd_import(name[level:], package, level) 
    File "<frozen importlib._bootstrap>", line 978, in _gcd_import 
    File "<frozen importlib._bootstrap>", line 961, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 950, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 655, in _load_unlocked 
    File "<frozen importlib._bootstrap_external>", line 678, in exec_module 
    File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/src/banzai_platform/urls.py", line 67, in <module> 
    url(r'^registrations/', include('registrations.urls')), 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/conf/urls/__init__.py", line 50, in include 
    urlconf_module = import_module(urlconf_module) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/importlib/__init__.py", line 126, in import_module 
    return _bootstrap._gcd_import(name[level:], package, level) 
    File "<frozen importlib._bootstrap>", line 978, in _gcd_import 
    File "<frozen importlib._bootstrap>", line 961, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 950, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 655, in _load_unlocked 
    File "<frozen importlib._bootstrap_external>", line 678, in exec_module 
    File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/src/registrations/urls.py", line 3, in <module> 
    from .views import (
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/src/registrations/views.py", line 160, in <module> 
    class ConfirmEventListView(ListView): 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/src/registrations/views.py", line 164, in ConfirmEventListView 
    queryset = [obj for obj in events if obj.need_confirmation > 0] 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/db/models/query.py", line 250, in __iter__ 
    self._fetch_all() 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/db/models/query.py", line 1118, in _fetch_all 
    self._result_cache = list(self._iterable_class(self)) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/db/models/query.py", line 53, in __iter__ 
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 894, in execute_sql 
    raise original_exception 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 884, in execute_sql 
    cursor.execute(sql, params) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/db/backends/utils.py", line 80, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/db/utils.py", line 94, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/utils/six.py", line 685, in reraise 
    raise value.with_traceback(tb) 
    File "/Users/joedavy/Dropbox/Apps/banzai-platform-django/lib/python3.6/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
django.db.utils.ProgrammingError: relation "events_event" does not exist 
LINE 1: ...ents_event"."created", "events_event"."slug" FROM "events_ev... 
+0

Sie sollten beim Deployment keine Makemigrationen ausführen. Sie führen Makemigrationen aus, wenn Sie sich entwickeln. –

+0

Wenn Sie jedoch einen Fehler erhalten, sollten Sie ihn zusammen mit dem vollständigen Traceback * posten. –

+0

@DanielRoseman - um zu klären, mein erster Gedanke war es, manage.py zu migrieren, aber das gibt den gleichen Fehler. Ich habe den Fehler + traceback dem Beitrag hinzugefügt, falls das hilfreich ist. –

Antwort

1

Ihre Zurückverfolgungs zeigt, dass Sie führen in der ConfirmEventListView auf Klassenebene ein Listenverständnis über ein Abfrage-Set aus. Alles auf Klassenebene wird ausgeführt, wenn die Klasse zum ersten Mal importiert wird. Daher wird diese Abfrage sofort ausgeführt, wenn ein Django-Befehl ausgeführt wird, bevor die Migrationen ausgeführt werden konnten.

Sie dürfen nie etwas tun, das auf dieser Ebene auf die Datenbank zugreift. (Um ehrlich zu sein, sollten Sie dieses Listenverstehen überhaupt nicht machen, da es eine Liste und kein Abfrage-Set zurückgibt; es funktioniert also nicht mit Paginierung oder anderen Dingen, die ein tatsächliches Anfrage-Set erwarten. Allerdings, da der Rest Ihres Code funktioniert, wir können davon ausgehen, dass dies in Ihrem Fall kein Problem ist - noch nicht.)

Wenn need_confirmation ein Feld ist, sollte Ihr Queryset einfach als Event.objects.filter(need_confirmation__gt=0) definiert werden. Wenn es sich jedoch um eine Modellmethode handelt, sollten Sie eine get_queryset()-Methode für ConfirmEventListView definieren und diese Verarbeitung dort statt auf Klassenebene durchführen.

+0

Danke eine Tonne - das erklärt, warum ich den Fehler bekam. Also wird eine Methode innerhalb der Klasse wie 'get_queryset()' nicht ausgewertet? 'need_confirmation' ist eine Modellmethode, die mit @property deklariert wird. Gibt es eine Anleitung dazu, wie ich anstelle einer Listenfilterung basierend auf der Modellmethode ein Abfrageset zurückgeben würde? –

+1

Der Unterschied besteht darin, dass 'get_queryset' als Teil der Anfrage und nicht zur Definitionszeit aufgerufen wird. In der Tat, wie ich gerade auf eine andere Frage hingewiesen habe, ist es durchaus zulässig, eine Liste von dieser Methode zurückzugeben; also verschiebe einfach die Liste comp in die Methode und gib sie zurück und alles sollte gut sein. –

+0

Awesome - tat das und die Dinge scheinen jetzt zu funktionieren. –

Verwandte Themen