2015-10-05 9 views
6

ich einige Änderungen an meinen Modellen gemacht und lief dann eindjango db Migration ist fehlgeschlagen mit Postgres

Python manage.py makemigrations Python

wandern manage.py

und ich habe diese Zurückverfolgungs:

Operations to perform: 
    Synchronize unmigrated apps: staticfiles, messages 
    Apply all migrations: sessions, admin, study, auth, quiz, contenttypes, main 
Synchronizing apps without migrations: 
    Creating tables... 
    Running deferred SQL... 
    Installing custom SQL... 
Running migrations: 
    Rendering model states... DONE 
    Applying quiz.0013_auto_20151005_0644...Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 338, in execute_from_command_line 
    utility.execute() 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 330, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 393, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 444, in execute 
    output = self.handle(*args, **options) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 222, in handle 
    executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 110, in migrate 
    self.apply_migration(states[migration], migration, fake=fake, fake_initial=fake_initial) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 154, in apply_migration 
    self.recorder.record_applied(migration.app_label, migration.name) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/recorder.py", line 67, in record_applied 
    self.migration_qs.create(app=app, name=name) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 348, in create 
    obj.save(force_insert=True, using=self.db) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 734, in save 
    force_update=force_update, update_fields=update_fields) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 762, in save_base 
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 846, in _save_table 
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 885, in _do_insert 
    using=using, raw=raw) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 127, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 920, in _insert 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 974, in execute_sql 
    cursor.execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 97, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
django.db.utils.IntegrityError: duplicate key value violates unique constraint "django_migrations_pkey" 
DETAIL: Key (id)=(27) already exists. 

Ich wusste nicht genau, wie man den Fehler interpretiert, dass der Primärschlüssel bereits existiert. Seltsamerweise hat es das Feld in die Datenbank eingefügt, weil ich es auf meiner Site ausgegeben habe und als ich eine Shell ausgeführt habe, konnte ich sehen, dass die Felder hinzugefügt wurden und die von mir ausgewählten Standarddaten ausgefüllt wurden.

Ich beschloss, die Migration wieder laufen, um zu sehen, ob es nach dem zweiten Mal passieren würde, und ich habe eine andere Zurückverfolgungs ...

Operations to perform: 
    Synchronize unmigrated apps: staticfiles, messages 
    Apply all migrations: sessions, admin, study, auth, quiz, contenttypes, main 
Synchronizing apps without migrations: 
    Creating tables... 
    Running deferred SQL... 
    Installing custom SQL... 
Running migrations: 
    Rendering model states... DONE 
    Applying quiz.0013_auto_20151005_0644...Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 338, in execute_from_command_line 
    utility.execute() 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 330, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 393, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 444, in execute 
    output = self.handle(*args, **options) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 222, in handle 
    executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 110, in migrate 
    self.apply_migration(states[migration], migration, fake=fake, fake_initial=fake_initial) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 148, in apply_migration 
    state = migration.apply(state, schema_editor) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/migration.py", line 115, in apply 
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/operations/fields.py", line 62, in database_forwards 
    field, 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 398, in add_field 
    self.execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 111, in execute 
    cursor.execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 97, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
django.db.utils.ProgrammingError: column "lang1_back_to_choice" of relation "quiz_langpairinstructions" already exists 

Nun, wenn ich es noch einmal versuchen, werde ich immer den zweiten Zurückverfolgungs bekommen . Ich frage mich, was ich tun soll, damit ich Migrationen in die Zukunft machen kann. Warum erhalte ich diesen Fehler, wenn in der db selbst alles reibungslos funktioniert?

Antwort

4

Ich habe den Namen der Spalte 'django_migrations_pkey' übersehen und ich habe nicht bemerkt, dass das in der Datenbank war. Irgendwie war Django einen Schritt hinter der eigentlichen Datenbank und versuchte, den Primärschlüssel (pk = 27) anstelle der Zahl zu verwenden (die eigentlich 28 hätte sein sollen)

Ich war mir nicht sicher, wie ich das von innen ändern könnte django also, stattdessen habe ich nur die letzte Spalte aus der Datenbank gelöscht, so war es ein Primärschlüssel kürzer und auf dem richtigen Weg mit Django und es begann gut zu funktionieren.

+1

können Sie auch den Befehl hinzufügen, mit dem Sie die letzte Spalte gelöscht haben und welche Tabelle gelöscht werden soll. Das kann deine Antworten extrem nützlich für neue Entwickler in dem Spiel wie mir machen. – Khay

10

Es gibt einen anderen Weg. Sie sind der einzige id Wert in django_migrations Tabelle wissen, sagen Sie es 100. Dann ist, müssen Sie dies tun:

ALTER SEQUENCE django_migrations_id_seq RESTART WITH 101; 
1

bekam ich diesen Fehler nachdem ich vorher manuell mit den django Migrationen Tabellen Einträge gebastelt (nach einigen zuvor wurden zweifelhafte Migrationen hinzugefügt und dann entfernt).

Dies hat die django_migrations-IDs (sozusagen) in der ursprünglichen Position des Eintrags in der Tabelle django_migrations außer Betrieb gesetzt.

Das Problem ist, dass django die ID des letzten Eintrags und +1 nimmt, um einen neuen Eintrag zu erstellen (in der Tabelle unten: 197 + 1 = 198), aber wie Sie sehen Schlüssel (ID) = (198) bereits existiert in der Tabelle.

187 | foo_app    | 0016_auto_20161220_2332      | 2017-01-06 05:22:07.666172+00 
198 | bar_app    | 0004_auto_20160423_2122      | 2017-01-13 05:38:31.922738+00 
197 | baz_app    | 0013_auto_20170203_2311      | 2017-02-08 18:50:22.70143+00 

Wie Sie sehen können, sind die Zahlen für den Primärschlüssel auf der linken Seite nicht in Ordnung. Ich löschte die Einträge in der django_migration manuell und fügte sie dann wieder hinzu.

DELETE from django_migrations where name = '0004_auto_20160423_2122'; 
DELETE from django_migrations where name = '0013_auto_20170203_2311'; 

INSERT INTO django_migrations VALUES (188, 'baz_app', '0013_auto_20170203_2311', date()); 
INSERT INTO django_migrations VALUES (189, 'bar_app', '0004_auto_20160423_2122', date()); 

Bemerkenswert ist auch, dass die Migration, die ich anfangs hinzufügen versuche ‚new_app,‚0002_auto_00000000_1111‘tatsächlich die new_app Tabelle in Postgres geändert, aber die django_migrations Tabelle nicht aktualisiert bekommt.

django.db.utils.ProgrammingError: column "new_app_field" of relation "new_app_new" already exists 

Meine Lösung oben regelte das Problem für mich:

Also das zweite Mal, dass ich versuchte, die Migration 0002_auto_00000000_1111 Ich habe den Fehler zu wiederholen.