Как создать новую базу данных для существующего приложения с помощью Django South и установить значения по умолчанию?

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

Кажется, этот процесс должен быть:

  1. создать БД
  2. SyncDB
  3. мигрировать

Однако, когда я пытаюсь перенести базы данных, одна из более ранних миграций (миграция 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?

Если у вас есть приложение с миграцией на юг, как бы вы создали новую базу данных с нуля?

Я не могу перенести, потому что в целочисленном поле не задано значение по умолчанию. Как установить значение по умолчанию в более старой миграции? Поле даже больше не существует.

попытка синтаксиса:

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

1 ответ

Решение

Эндрю Годвин дал ответ:

Да, используйте:

./manage.py syncdb --all  

затем:

./manage.py migrate --fake  

Это, однако, также игнорирует любые миграции, которые добавляют данные в базу данных.

'syncdb' больше не поддерживается, вместо этого см. этот ответ:

  1. Удалите все папки с именем "миграции".
  2. Зайдите в терминал и запустите:
    • ./manage.py makemigrations
    • ./manage.py migrate --run-syncdb
Другие вопросы по тегам