2017-04-18 34 views
0

Ich habe eine neue postgressql db in meiner Django-App innerhalb Heroku erstellt. Jedes Mal, wenn ich eine Migration starte, erhalte ich einen Fehler, den ich nicht verstehe.Django und Postgres Migration Fehler

Fehler:

Applying argent.0043_auto_20170322_1629...Traceback (most recent call last): 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
psycopg2.ProgrammingError: cannot cast type date to integer 
LINE 1: ...LTER COLUMN "date_id" TYPE integer USING "date_id"::integer,... 

Ich habe entfernt und hinzugefügt, um das nur Datumsfeld Ich habe, ohne Erfolg. Ich bekomme immer noch den gleichen Fehler, ob das Datumsfeld in meinen Modellen vorhanden ist oder nicht. Jede Einsicht würde sehr geschätzt werden.

models.py

class Entry(models.Model): 
    date = models.DateField(blank=True, null=True,) 
    euros = models.CharField(max_length=500, blank=True, null=True) 
    comments = models.CharField(max_length=900, blank=True, null=True) 
    euros_sum = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True) 
    xrate = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True) 
    dollars_sum = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True) 
    daily_savings_dollars = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True) 
    daily_savings_display = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True) 

    def get_absolute_url(self): 
     return reverse('argent:detail', kwargs={'pk': self.pk}) 

    def item_date(self): 
     row_title = self.date 
     return row_title 

    class Meta: 

     ordering = ['date'] 

Zurückverfolgungs:

Traceback (most recent call last): 
    File "manage.py", line 22, in <module> 
    execute_from_command_line(sys.argv) 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/__init__.py", line 363, in execute_from_command_line 
    utility.execute() 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/__init__.py", line 355, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/base.py", line 283, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/base.py", line 330, in execute 
    output = self.handle(*args, **options) 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/commands/migrate.py", line 204, in handle 
    fake_initial=fake_initial, 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/db/migrations/executor.py", line 115, in migrate 
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/db/migrations/executor.py", line 145, in _migrate_all_forwards 
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/db/migrations/executor.py", line 244, in apply_migration 
    state = migration.apply(state, schema_editor) 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/db/migrations/migration.py", line 129, in apply 
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state) 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/db/migrations/operations/fields.py", line 215, in database_forwards 
    schema_editor.alter_field(from_model, from_field, to_field) 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 513, in alter_field 
    old_db_params, new_db_params, strict) 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/postgresql/schema.py", line 112, in _alter_field 
    new_db_params, strict, 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 674, in _alter_field 
    params, 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 119, in execute 
    cursor.execute(sql, params) 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/db/utils.py", line 94, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/utils/six.py", line 685, in reraise 
    raise value.with_traceback(tb) 
    File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
django.db.utils.ProgrammingError: cannot cast type date to integer 
LINE 1: ...LTER COLUMN "date_id" TYPE integer USING "date_id"::integer,... 

Antwort

0

Wenn Sie wollen, um zu einem Datetime man die Datumsspalte aus einem Integer-Typ migrieren, müssen Sie alle vorhandenen zu handhaben Einträge, die Sie in der Tabelle haben, bevor Sie die Migration ausführen können. Wahrscheinlich haben Sie bereits einige Integer in der Spalte date, wenn Sie versuchen, den Spaltentyp zu ändern. Daher schlägt die Konvertierung fehl, da postgres nicht weiß, wie eine Ganzzahl in eine Datetime konvertiert werden soll.

Sie können entweder alle Eingaben löschen, wenn Sie nicht über sie kümmern, oder sonst müssen Sie Sie die Migration in getrennten Schritten brechen:

  1. Erstellen Sie die neue Datetime-Spalte mit einem temporären Namen
  2. Führen Sie eine Datenmigration durch, um Ihre Ganzzahlen in Datumsangaben zu konvertieren und die neue Spalte
  3. einzufügen. Löschen Sie die alte Ganzzahl-Datumsspalte, benennen Sie die neue Ganzzahl mit dem endgültigen Namen um.
+0

Es ist nicht so, dass ich die Datumsspalte von Ganzzahl zu Datetime konvertieren möchte. Es war immer eine Datetime-Spalte, und in der neuen db gibt es keine Daten. Ich übertrage von einer sqlitedb zu einer posgresdb (tut mir leid, dass ich das vorher nicht erwähnt habe) und muss nur die neuen Felder von meiner models.py in die neue posgresdb schreiben. Ich habe versucht, das Datumsfeld in ein Charfield zu ändern, und bekomme den gleichen Fehler, wenn ich eine neue Posgresdb aufstehe. – grigs

+0

Ich habe es herausgefunden. Es stellte sich heraus, dass alle meine alten migration.py-Dateien meine erste Migration auf Heroku abwendeten. Ich habe die alten Migrationsdateien in meiner App gelöscht. Meine App und alles lief so wie es sollte. Ich füge die Antwort hinzu. – grigs