Мигрирующие приспособления Django? - PullRequest
19 голосов
/ 23 октября 2010

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

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

Какой лучший способ продвинуть мои приборы вперед при миграции базы данных?

Ответы [ 3 ]

13 голосов
/ 23 октября 2010

Вот процесс, который я использовал:

  1. Откатите код до ревизии, которая сначала создала прибор. Например: svn up -r12345.

  2. Очистите базу данных, затем создайте ее с помощью manage.py syncdb --noinput --migrate

  3. Загрузить прибор с помощью manage.py loaddata my_fixture.json

  4. Сверните код вперед до svn up

  5. Перенос базы данных с помощью manage.py migrate

  6. Дамп данных с manage.py dumpdata --indent=2 myapp >my_fixture.json

Обратите внимание, что вы должны быть осторожны при выборе предыдущей ревизии для отката. В моем случае у меня были некоторые недавние исправления, которые должны были быть на месте, поэтому мне пришлось выбирать каталоги для отката к конкретным ревизиям. Утомительно, но лучше, чем ручное редактирование файла JSON из 9 000 строк.

Кроме того, на шаге 6 обязательно сбросьте правильный набор приложений.

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

1 голос
/ 23 октября 2010

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

python manage.py dumpdata <your_app> auth > test_data.json
0 голосов
/ 23 октября 2010

Какой лучший способ продвинуть мои приборы вперед при переносе базы данных?

Слишком поздно.

При переносе базы данных вам нужно loaddata и dumpdata.

Когда он перестает работать, уже слишком поздно.

Возможный запасной вариант - написать короткий сценарий для загрузки приборов JSON в память, а затем «вручную» собратьобъекты базы данных.

with open( "somefile.json", "r" ) as data:
    for obj in json.load( data ):
        if obj['model'] == 'someapp.somemodel':
            SomeNewModel.objects.create( 
                field = obj['fields']['element']
                ...
                )

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

...