Нет такой ошибки столбца в приложении Django после миграции на юг - PullRequest
18 голосов
/ 07 ноября 2010

Я столкнулся с той же проблемой, представленной комментатором здесь: Django South - таблица уже существует

Последующего наблюдения не было, поэтому я решил опубликовать новый вопрос. У меня есть приложение Django, миграциями которого я управляю с юга. Я добавил поле в свою модель, затем запустил

./manage schemamigration my_app --auto

, который бежал, как ожидалось. Запуск

./manage migrate my_app

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

./manage migrate my_app --fake

устранена ошибка таблицы, но теперь я получаю сообщение об ошибке Django о том, что столбец, связанный с новым полем, не существует.

./manage sqlall my_app

показывает, что схема соответствует ожидаемой.

Любые мысли о том, как это исправить, приветствуются!

Ответы [ 2 ]

32 голосов
/ 07 ноября 2010

Вероятно, самым простым способом для вас будет начать миграцию с нуля.

Удалите все migrations/* файлы для приложения, которое вы пытаетесь исправить.Восстановите models.py до состояния, которое в данный момент находится в базе данных (с помощью инструментов контроля версий или просто закомментируйте новые поля).Затем инициализируйте миграции:

manage.py migrate my_app --delete-ghost-migrations
manage.py schemamigration my_app --init
manage.py migrate my_app --fake

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

Теперь добавьте ваши изменения в models.py, и теперь юг будет в том, что изменилось:

manage.py schemamigration my_app --auto
manage.py migrate my_app
5 голосов
/ 21 августа 2013

За чем-то еще нужно следить: вы часто будете получать эту ошибку (DatabaseError: no such column: appname_model.fieldname), если вы используете значение default в отношении ForeignKey и добавляете поле к этой модели FK. 1004 *

Что-то вроде (в вашем models.py):

class MyAppModel(models.Model):
    my_foreign_key = models.ForeignKey(FkModel,
                                       default=lambda: FkModel.objects.get(id=1),
                                       null=True)

Затем в новой миграции вы добавляете новое поле в FkModel:

class FkModel(models.Model):
    new_field = models.IntegerField('New Field Name', blank=True, null=True)

Вы получите ошибку при запуске на юг schemamigration:

DatabaseError: no such column: myappmodel_fkmodel.new_field

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

Это укусило меня в прошлом. Надеюсь, это поможет кому-то в будущем.

...