Рабочий процесс Django при частом изменении моделей?
-
20-08-2019 - |
Вопрос
поскольку я обычно не занимаюсь предварительным дизайном своих моделей в проектах Django, в конечном итоге я часто изменяю модели и, таким образом, каждый раз удаляю свою тестовую базу данных (потому что "syncdb" никогда не изменит таблицы автоматически для вас).Ниже приведен мой рабочий процесс, и я хотел бы услышать о вашем.Любые мысли приветствуются..
- Измените модель.
- Удалите тестовую базу данных.(для меня всегда простая база данных sqlite.)
- Запустите "syncdb".
- Сгенерируйте некоторые тестовые данные с помощью кода.
- переход 1.
Вторичный вопрос по этому поводу..В случае, если ваш рабочий процесс похож на описанный выше, как вы выполняете 4.шаг?Вы генерируете тестовые данные вручную или в приложениях Django есть подходящая точка подключения, куда вы можете ввести код, генерирующий тестовые данные, при запуске сервера?\
ТИА.
Решение
Шаги 2 и 3 можно выполнить за один шаг:
manage.py reset appname
Шаг 4, насколько я понимаю, проще всего выполнить с помощью приспособления
Другие советы
Это работа для компании Django.Они удобны, потому что не зависят от базы данных, а тестовый жгут (и manage.py) имеет встроенную поддержку для них.
Чтобы использовать их:
- Настройте свои данные в своем приложении (назовите его "foo") с помощью инструмента администрирования
- Создайте каталог приспособлений в своем каталог приложения "foo"
- Тип:
python manage.py dumpdata --indent=4 foo > foo/fixtures/foo.json
Теперь, после вашего этапа syncdb, вы просто вводите:
python manage.py loaddata foo.json
И ваши данные будут созданы заново.
Если вы хотите, чтобы они были в тестовом примере:
class FooTests(TestCase):
fixtures = ['foo.json']
Обратите внимание, что вам придется воссоздавать или вручную обновлять свои приспособления, если ваша схема кардинально изменится.
Вы можете прочитать больше о приспособлениях в документах django для Загрузка приспособления
Вот что мы делаем.
Приложения именуются с указанием номера версии схемы.
appa_2
,appb_1
, и т.д.Незначительные изменения не меняют номер.
Основные изменения увеличивают это число.Syncdb работает.И может быть написан сценарий "переноса данных".
def migrate_appa_2_to_3(): for a in appa_2.SomeThing.objects.all(): appa_3.AnotherThing.create( a.this, a.that ) appa_3.NewThing.create( a.another, a.yetAnother ) for b in ...
Дело в том, что удаление и воссоздание не всегда уместно.Иногда бывает полезно переместить данные из старой модели в новую, не перестраивая их с нуля.
Юг - самый крутой.
Хотя старый добрый сброс работает лучше всего, когда данные не имеют значения.
Чтобы добавить к ответу Мэтью, я часто также использую пользовательский SQL для предоставления исходных данных в документированном виде здесь.
Django просто ищет файлы в <app>/sql/<modelname>.sql
и запускает их после создания таблиц во время syncdb
или sqlreset
.Я использую пользовательский SQL, когда мне нужно сделать что-то вроде заполнения моих таблиц Django из других таблиц базы данных, отличных от Django.
Лично моя база данных разработки для проекта, над которым я сейчас работаю, довольно большая, поэтому я использую dmиграции создавать сценарии миграции БД для изменения БД (вместо того, чтобы каждый раз уничтожать БД, как я делал в начале).
Редактировать:Вообще-то, сейчас я использую South :-)