Как запустить новый код django со старой базой данных?

Извините, если название вопроса вводит в заблуждение, но вот в чем дело.

У меня есть дамп базы данных, которая использовалась со старой версией приложения django (django ‹ 1.7).

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

Как я думал, это будет работать:

Восстановите базу данных, запустите новую миграцию (миграции 1.7) с помощью ./manage.py migrate.

Сделанный!

Но когда я запускаю миграции, у меня возникает ошибка «Связь уже существует».

Я знаю, что это происходит, вероятно, потому, что база данных не синхронизирована с историей миграции или что-то в этом роде... Но я не знаю, что делать.

EDIT1 Я чувствую, что единственный способ - вручную создать сценарий миграции или что-то в этом роде, потому что теперь есть способ синхронизировать базу данных с новыми миграциями.

Итак, предположим, что в базе данных есть таблица с именем TABLE и два столбца C1 и C2.

Теперь, когда я переходил с 1.6 на 1.7, я добавил столбец C3. Таким образом, первоначальная миграция выглядит примерно так: «создать таблицу TABLE со COLUMNS C1, C2, C3».

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


person user1685095    schedule 28.01.2015    source источник


Ответы (1)


  1. Удалить новые столбцы.
  2. Создайте начальные миграции.
  3. Поддельные первоначальные миграции для всех приложений:

    python manage.py migrate --fake yourappnamehere 0001
    
  4. Добавляйте столбцы, создавайте новые миграции.
  5. Выполните новые миграции.
person zymud    schedule 28.01.2015
comment
Гм... Я не знаю, какие столбцы новые. Так что это потребует ручной проверки. Не совсем вариант. 2. У меня уже есть миграции. Зачем мне создавать еще один? Разве это не сломает другие миграции? - person user1685095; 28.01.2015
comment
1. Вы можете создавать модели django из существующей базы данных: python manage.py inspectdb > models.py и проверять, какие столбцы являются новыми. Если ваша БД действительно огромна, вы можете написать простой парсер, который будет сравнивать ваши модели и сгенерированные из вашей базы. 2. Насколько я понимаю, ваши текущие миграции не соответствуют базе данных, поэтому их необходимо удалить. - person zymud; 28.01.2015
comment
Нет, их не нужно удалять. БД надо изменить в состояние, при котором она будет соответствовать новым миграциям, не иначе =) - person user1685095; 28.01.2015
comment
И да, я понял. Вероятно, мне следует удалить вопрос, потому что я думал об этом автоматически с использованием инструментов миграции и django. Я, конечно, могу сделать это вручную, кое-где удалить и синхронизировать базу данных и миграции, но это непродуктивно, поэтому мне это не интересно. Хотя я все еще думаю, что миграции в django должны это делать. - person user1685095; 28.01.2015
comment
Я имею в виду, они могут синхронизировать пустую базу данных с миграциями, верно? Таким образом, синхронизировать непустую базу данных с миграциями — это еще один шаг вперед. Во-первых, из миграции найдите, как должна выглядеть текущая схема, затем проверьте фактическую схему, а затем сделайте фактическую схему текущей схемой, добавив новые таблицы, столбцы или удалив их. Кажется довольно легким. - person user1685095; 28.01.2015
comment
Да, ваша мысль верна, но, к сожалению, я не знаю, как сделать это абсолютно автоматически. - person zymud; 28.01.2015