Переместить модель 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. Обновление видов для использования новых моделей
  3. Обновите модульные / системные тесты, чтобы убедиться, что ничего не сломалось (важно!)
  4. Напишите команду управления, которая заполняет новые модели на основе старых моделей.
  5. Развернуть код
  6. Запустить миграцию для новых моделей
  7. Запустить сценарий управления командой для обновления новых моделей
  8. Оставьте старое приложение на 1-2 недели, и когда вы думаете, что все хорошо, отбросьте их.

Причины, по которым я не использовал миграцию данных:

  1. Не знаком - чувствовал, что задача слишком важна, чтобы использовать процесс, с которым я не был знаком
  2. Более удобное перемещение данных с помощью кода Python, чем с помощью South Magic
  3. Столкнулся с проблемами миграции на юг с зависимостями. Не хотел еще больше усложнять миграцию с миграцией данных. Это может быть ошибочным предположением из-за моего незнакомого с механизмом переноса данных
  4. Возможно, в качестве предвзятого мнения из пункта 3, я убедил себя, что использование South в качестве инструмента управления схемами - это "правильный" способ. Создание / обновление данных должно быть выполнено в слое Django, используя либо приборы, либо пользовательские команды управления.

Самое простое решение, которое я мог придумать:

  1. Создать SchemaMigration изменение типа каждого внешнего ключа для моделей в старом приложении на примитивный тип (включая внутренние);
  2. Создавайте новые приложения и их модели в обычном режиме;
  3. Выполнить миграцию данных из старых таблиц в новые;
  4. Создать другой SchemaMigrationизменив каждый тип примитива на внешний ключ снова, теперь указывая на новые таблицы;
  5. Удалите старое приложение из настроек и удалите его таблицы.

Трудоемко, да, но сделаю свое дело. Я надеюсь на лучшее решение, хотя.

Другие вопросы по тегам