Переместить модель Django из одного приложения в другое
Я сделал глупую ошибку, создав слишком много моделей в одном приложении Django, теперь я хочу разделить его на 3 отдельные. Проблема в том, что данные уже находятся на производстве на сайтах двух клиентов, поэтому мне нужно тщательно спланировать любую миграцию схемы / данных (я использую django-south). Я не уверен, как поступить, любой совет будет принята с благодарностью.
(Я использую PostgreSQL на сервере Ubuntu 12.4 LTS, если это имеет какое-либо значение)
Я думал об использовании db.rename_table
, но не может понять, как правильно обновить внешние ключи для этих моделей (от старых к новым) - не имеет значения на уровне базы данных (поскольку переименование таблицы уже охватило это), но не на уровне ORM.
Обновление: подумав об этом и задав этот вопрос программистам.SE, я решил не усложнять ситуацию и не беспокоиться о миграции между основными версиями продукта. Краткосрочный, я просто буду использовать db.rename_table
чтобы соответствовать новому имени, также используя db_table
как предположил Дэниэл Роузман, все время сохраняя модели в старом приложении. При обновлении до основной версии я переключаюсь на новое приложение и полностью отказываюсь от всех миграций (поэтому при новой установке новой версии база данных будет создаваться "как есть", а не проходить все исторические миграции).
3 ответа
Я не понимаю, зачем вам вообще нужна миграция данных.
Просто переместите модели в новое приложение и добавьте db_table
установка во внутренних мета-классах для указания на старые имена таблиц.
Недавно я сделал нечто подобное в меньшем масштабе, и это был мой процесс:
- Создать новое приложение и соответствующие модели
- Обновление видов для использования новых моделей
- Обновите модульные / системные тесты, чтобы убедиться, что ничего не сломалось (важно!)
- Напишите команду управления, которая заполняет новые модели на основе старых моделей.
- Развернуть код
- Запустить миграцию для новых моделей
- Запустить сценарий управления командой для обновления новых моделей
- Оставьте старое приложение на 1-2 недели, и когда вы думаете, что все хорошо, отбросьте их.
Причины, по которым я не использовал миграцию данных:
- Не знаком - чувствовал, что задача слишком важна, чтобы использовать процесс, с которым я не был знаком
- Более удобное перемещение данных с помощью кода Python, чем с помощью South Magic
- Столкнулся с проблемами миграции на юг с зависимостями. Не хотел еще больше усложнять миграцию с миграцией данных. Это может быть ошибочным предположением из-за моего незнакомого с механизмом переноса данных
- Возможно, в качестве предвзятого мнения из пункта 3, я убедил себя, что использование South в качестве инструмента управления схемами - это "правильный" способ. Создание / обновление данных должно быть выполнено в слое Django, используя либо приборы, либо пользовательские команды управления.
Самое простое решение, которое я мог придумать:
- Создать
SchemaMigration
изменение типа каждого внешнего ключа для моделей в старом приложении на примитивный тип (включая внутренние); - Создавайте новые приложения и их модели в обычном режиме;
- Выполнить миграцию данных из старых таблиц в новые;
- Создать другой
SchemaMigration
изменив каждый тип примитива на внешний ключ снова, теперь указывая на новые таблицы; - Удалите старое приложение из настроек и удалите его таблицы.
Трудоемко, да, но сделаю свое дело. Я надеюсь на лучшее решение, хотя.