Почему необходимо перенести миграцию django в систему контроля версий

Это обычная практика, когда люди, работающие над проектом django, обычно отправляют миграции в систему контроля версий вместе с другим кодом.

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


person Ishtiaq    schedule 03.09.2015    source источник


Ответы (3)


Если вы не зафиксируете их в VCS, то произойдет следующее: люди будут вносить потенциально конфликтующие изменения в модель.

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

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

person Sayse    schedule 03.09.2015
comment
Например, человек А создал ветку из master и создал новую миграцию 0010, человек Б создал ветку из master и создал новую миграцию 0010. A объединился для разработки раньше, чем B, когда B получил последнее изменение и попытался объединить свой код с master, он получил дублирующую миграцию. Если вы не отслеживаете миграции, B будет очень сбит с толку. - person Shang Wang; 03.09.2015
comment
OP предполагает, что об этом должны позаботиться отправка файлов моделей и создание из них миграций. Я сам задавался этим вопросом. Разрешение несогласованных миграций, особенно для общих веток и незавершенных работ, было огромной тратой времени. Я вижу точку @alasdair ниже об автоматическом заполнении (это единственное исключение, которое имеет для меня смысл, хотя оно не применяется, если вы используете фабрики вместо пользовательских миграций). Я хотел бы увидеть лучшие предложения по передовым методам предотвращения конфликтов миграции и / или более эффективные инструменты для их разрешения. - person szeitlin; 26.10.2015
comment
например, я только что столкнулся с проблемой, с которой сталкиваюсь довольно часто, когда при попытке миграции отсутствуют зависимости слияния. Проблема в том, что файлы миграции в отдельных приложениях не всегда синхронизируются между ветками. Ошибки django не дают вам полный путь к файлу миграции, вызвавшему проблему, а только номер. #потерпеть неудачу - person szeitlin; 26.10.2015
comment
@szeitlin - я бы посоветовал вам задать новый вопрос о вашей проблеме, не стесняйтесь обращаться к этому вопросу - person Sayse; 27.10.2015
comment
Спасибо ! Я думаю stackoverflow.com/questions/3550887/ может помочь решить мою текущую проблему, но я все же могу задать более важный вопрос о том, как лучше всего управлять общими миграциями. Меня также интересует ответ ниже от @knbk re: testing. - person szeitlin; 27.10.2015

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

Миграции, как и любой другой код, необходимо тестировать, по крайней мере, на базовом уровне. Даже если они генерируются автоматически, это не гарантирует, что они будут работать в 100% случаев. Таким образом, безопасный путь — создать миграции в вашей среде разработки, протестировать их, а затем отправить в производственную среду, чтобы применить их там.

person knbk    schedule 03.09.2015
comment
Не могли бы вы привести примеры того, какие тесты вы используете для этого? Вы проверяете наличие данных? - person szeitlin; 27.10.2015

Во-первых, миграции в системе контроля версий позволяют запускать их в продакшене.

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

person Alasdair    schedule 03.09.2015
comment
Но мы также можем генерировать миграции в рабочей среде, а затем применять эти миграции. Что-то не так с этим подходом.? - person Ishtiaq; 03.09.2015
comment
Да, теоретически вы можете генерировать миграции в продакшене (но не пользовательские миграции, как я отметил выше). Однако создание миграций в рабочей среде может вызвать проблемы, если вам нужно выполнить миграцию перед обновлением кода (например, при добавлении новой модели). - person Alasdair; 03.09.2015
comment
@Alasdair говорит о том, что вы должны отслеживать их, потому что вам могут понадобиться миграции данных (пользовательские миграции). В некоторых случаях люди вручную пишут миграцию, чтобы добиться чего-то вроде заполнения исходных данных и т. д. Если вы не сохраните их в системе контроля версий, вы потеряете след этих шагов. - person Shang Wang; 03.09.2015