2015-11-12 2 views
13

Python 3, Django 1.8.5, PostgresДжанго миграции Ошибка: Столбец не существует

У меня есть модель Sites, которая работает отлично. Недавно я попытался добавить поле, airport_code и перенести данные.

class Site(BaseModel): 

    objects = SiteManager() 

    name = models.CharField(max_length=200, unique=True) 
    domain = models.CharField(max_length=200, unique=True) 
    weather = models.CharField(max_length=10) 
    nearby_sites = models.ManyToManyField('self', symmetrical=False, blank=True) 
    users = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True) 
    facebook = models.URLField(max_length=200) 
    twitter = models.URLField(max_length=200) 
    header_override = models.TextField(blank=True) 
    email_header_override = models.TextField(blank=True) 
    timely_site_tag_id = models.IntegerField() 
    timely_featured_tag_id = models.IntegerField() 
    timely_domain = models.CharField(max_length=255) 
    sitemap_public_id = models.CharField(max_length=255) 
    state = models.CharField(max_length=24) 
    airport_code = JSONField() 

Однако, когда я побежал makemigrations я получил ошибку:

django.db.utils.ProgrammingError: column sites_site.airport_code does not exist LINE 1: ..._site"."sitemap_public_id", "sites_site"."state", "sites_sit...

Конечно, это не имеет смысла, так как столбец, очевидно, не существует, когда я пытаюсь создайте его в рамках миграции.

Я видел много вопросов об этой ошибке в переполнении стека, которые остались без ответа или имеют решение вручную создать файл миграции или уничтожить и перестроить базу данных. Это нехорошее решение.

ответ

6

Эта ошибка была решена для меня, комментируя панель инструментов отладки django из INSTALLED_APPS в settings.py. Я не уверен, что панель инструментов отладки является виновником, но после того, как я прокомментировал это, я смог запустить makemigrations и migrate без каких-либо проблем.

Надеясь, что это поможет кому-то, поскольку я провел двенадцать часов, пытаясь понять это.

+4

Это происходит для меня тоже, но, к сожалению, я не с помощью панели инструментов Django. Не знаю, как продолжить ... –

+0

Комментируя панель инструментов Django, я тоже работал. Моя база данных - SQLite. – JimInCO

6

После запуска makemigrations не забудьте пройти трассировку стека шаг за шагом.

В моем случае я заметил, что он прослеживается через вызов формы, содержащейся в form.py, в совершенно другом приложении, которое вызвало вызов модели, к которой я пытался создать новую миграцию.

Перемещение класса формы из формы.py в view.py устраняет проблему.

-1

Запуск этой проблемы после переноса моей базы данных postgres на другой сервер. Как-то я испортил базу данных и не смог обновить мою модель с помощью нового класса UserProfile.

Я решил проблему, создавая первоначальную миграцию для существующей схемы:

  1. опорожнить django_migrations таблицы: delete from django_migrations; с командой DELETE FROM django_migrations WHERE app='my_app';
  2. Для каждого приложения, удалите его migrations папку: rm -rf <app>/migrations/
  3. Сброс миграции для «встроенных» приложений: python manage.py migrate --fake
  4. Для каждого запуска приложения: python manage.py makemigrations <app>. Позаботьтесь о зависимостях (модели с ForeignKey должны запускаться после их родительской модели).
  5. Наконец: python manage.py migrate --fake-initial

Понял здесь: https://stackoverflow.com/a/29898483

PS Я не уверен, что это имеет отношение к решению этой проблемы, но, во-первых, я бросил таблицу в PostgreSQL, которая вызвала и прокомментировал класс UserProfile в моделях.

в оболочке:

sudo -su postgres 
psql databse_name 
DROP TABLE table_name; 

models.py:

#class UserProfile(models.Model): 
    #user = models.OneToOneField(settings.AUTH_USER_MODEL, unique=True, primary_key=True, on_delete=models.CASCADE, related_name='user_profile') 
    #avatar = ThumbnailerImageField(upload_to='profile_images', blank=True) 
    #country = models.CharField(max_length = 128) 
Смежные вопросы