2015-10-05 20 views
6

ho fatto alcune modifiche ai miei modelli e poi correva unmigrazione django db riuscita con postgres

makemigrations pitone manage.py pitone manage.py migrare

e ho ottenuto questo traceback:

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. 

Non sapevo bene come interpretare l'errore che la chiave primaria esiste già. Stranamente ha aggiunto il campo nel database perché stavo vedendo l'output sul mio sito e quando ho eseguito una shell ho potuto vedere che i campi sono stati aggiunti e che i dati predefiniti "che ho scelto" erano popolati.

ho deciso di eseguire di nuovo la migrazione per vedere se sarebbe passato dopo una seconda volta e ho ottenuto un traceback diverso ...

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 

Ora, se provo ancora Sarò sempre ottenere il secondo traceback . Mi chiedo cosa dovrei fare per poter fare migrazioni nel futuro. Perché ricevo questo errore se tutto sembra essere andato liscio nel db stesso?

risposta

4

Ho trascurato il nome della colonna "django_migrations_pkey" e non avevo capito che era nel database. In qualche modo Django era un passo indietro rispetto al database reale e cercava di utilizzare la chiave primaria (pk = 27) anziché il numero in cui era effettivamente attivo (che avrebbe dovuto essere 28)

Non ero sicuro di come cambiarlo dall'interno django così invece ho appena cancellato l'ultima colonna dal database in modo che fosse una chiave primaria più breve e in pista con django e ha iniziato a funzionare bene.

+1

È possibile aggiungere anche il comando utilizzato per eliminare l'ultima colonna e quale tabella deve essere eliminata. Ciò può rendere le tue risposte estremamente utili per i nuovi sviluppatori nel settore come me. – Khay

10

C'è un altro modo. Poiché si sa l'ultimo id valore django_migrations tavolo, dire che è 100. Quindi, è necessario fare questo:

ALTER SEQUENCE django_migrations_id_seq RESTART WITH 101; 
1

ho ottenuto questo errore dopo che avevo in precedenza armeggiato manualmente con le voci di migrazioni Django tavoli (dopo un po ' sono state aggiunte e poi rimosse le migrazioni precedentemente evasive).

Questo ha lasciato gli ID di django_migrations fuori ordine (per così dire) con la posizione predefinita della voce nella tabella django_migrations.

Il problema è che Django prende l'ID dell'ultima voce e +1 per creare una nuova voce (nella tabella seguente: 197 + 1 = 198), tuttavia come puoi vedere Key (id) = (198) già esiste nella tabella

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 

Come si può vedere i numeri per la chiave primaria a sinistra sono fuori servizio. Quello che ho fatto è stato cancellare manualmente le voci fuori ordine nel django_migration e quindi riaggiungerle.

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()); 

Degna di nota è che la migrazione che stavo inizialmente provando ad aggiungere 'NEW_APP, '0002_auto_00000000_1111' effettivamente modificato la tabella di NEW_APP in Postgres, ma il tavolo django_migrations non si aggiorna.

Così la seconda volta che ho provato a eseguire nuovamente la migrazione 0002_auto_00000000_1111 ho ottenuto l'errore:

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

La mia soluzione sopra risolto il problema per me.

Problemi correlati