Ответ 1
Эндрю Годвин дал ответ:
Да, используйте:
./manage.py syncdb --all
тогда:
./manage.py migrate --fake
Это, однако, также игнорирует любые миграции, которые добавляют данные в базу данных.
Я работаю с проектом ОС, который использует Юг для миграции базы данных. Я создаю новую базу данных с нуля, и я хочу убедиться, что Юг настроен, поэтому я могу легко обновить базу данных в будущем.
Кажется, этот процесс должен быть:
Однако, когда я пытаюсь выполнить миграцию баз данных, одна из предыдущих миграций (миграция 0004 и переход на 0009) выдает исключение:
ValueError: You cannot add a null=False column without a default value.
Я не понимаю, как добавить значение по умолчанию для миграции 0004, поэтому это исключение не выбрано.
Миграции не нужно запускать, потому что база данных пуста.
Однако south_migrationhistory должен содержать список всех миграций и когда они были применены.
Я попытался взломать его и просто добавить миграцию 0009 в базу данных вручную, но это породило еще одну ошибку, поскольку промежуточные миграции не выполнялись. Я также попытался добавить поле в базу данных, чтобы увидеть, могу ли я понять, что синтаксис add_column будет выглядеть со значением по умолчанию 0. Формат выглядит совершенно иначе, чем эти более старые миграции.
Вот две разные версии синтаксиса add_column:
#0004 syntax:
db.add_column('experiments_dailyreport', 'test_group_size', orm['experiments.dailyreport:test_group_size'])
#0009 syntax:
syntax db.add_column('experiments_dailyreport', 'test_group_size', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False)
Итак, я предполагаю, что произошел сменой кода Юга между тем, когда было создано 0004 и сегодня.
Есть ли способ создать базу данных с помощью syncdb, а затем как-то обновить south_migrationhistory, не запуская manage.py migrate?
Если у вас есть существующее приложение с южными переходами, как бы вы создали новую базу данных с нуля?
Я не могу выполнить миграцию, потому что в поле integer нет значения по умолчанию. Как установить значение по умолчанию в более старой миграции? Поле больше не существует.
Синтаксис:
db.add_column('experiments_dailyreport', 'test_group_size', orm['experiments.dailyreport:test_group_size'], {'default': 0})
#throws ValueError: You cannot add a null=False column without a default value.
db.add_column('experiments_dailyreport', 'test_group_size', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False)
#throws AttributeError: Migration instance has no attribute 'gf'
Я использую South-0.7.2-py2.7.egg
Эндрю Годвин дал ответ:
Да, используйте:
./manage.py syncdb --all
тогда:
./manage.py migrate --fake
Это, однако, также игнорирует любые миграции, которые добавляют данные в базу данных.