В django в чем разница между mergemigrations и squashmigrations?

Когда мы должны использовать mergemigrations --meerge/mergemigrations и когда использовать squashmigrations можем ли мы выполнять эти команды через конвейер вместо того, чтобы каждый разработчик в команде делал это вручную ?

Предположим, что в папке migration имеются следующие миграции.

./foo
    ./migrations
        0001_initial.py
        0002_userprofile.py
        0003_article.py
        0004_auto_add.py

выше заказанные до сих пор? Так как мы работаем в команде.

  • Разработчик1 работает над функциями article и создал миграцию 0005_add_name_in_article.py
  • Разработчик2 работает над функциями userprofile и создал 0005_add_mobile_in_userprofile.py
  • Developer3 работает над функциями category и создал 0005_category.py
  • .

Сейчас возникла ситуация, когда

  • Developer1 объединит код в ветку develop, файл миграции будет иметь вид
./foo
    ./migrations
        0001_initial.py
        0002_userprofile.py
        0003_article.py
        0004_auto_add.py
        0005_add_name_in_article.py
  • Developer2 объединит код в ветку develop, файл миграции будет иметь вид
./foo
    ./migrations
        0001_initial.py
        0002_userprofile.py
        0003_article.py
        0004_auto_add.py
        0005_add_name_in_article.py
        0005_add_mobile_in_userprofile.py

Здесь последние две миграции имеют одинаковую зависимость, и это нарушает порядок миграции, в то время как Developer2 после слияния develop ветви django предоставит хит для merge миграции. После выполнения команды Django создаст новую миграцию, 0006_merge_add_name_in_article_add_mobile_in_userprofile.py, которая представляет собой слияние 0005_add_name_in_article.py и 0005_add_mobile_in_userprofile.py
. Файл содержит

  dependencies = [
        ('app_name', '0005_add_name_in_article'),
        ('app_name', '0005_add_mobile_in_userprofile'),
    ]

Теперь локальная ветвь Developer2 имеет следующие миграции.

./foo
    ./migrations
        0001_initial.py
        0002_userprofile.py
        0003_article.py
        0004_auto_add.py
        0005_add_name_in_article.py
        0005_add_mobile_in_userprofile.py
        0006_merge_add_name_in_article_add_mobile_in_userprofile.py

Теперь Разработчик2 поднимет PR и объединит, чтобы у другого разработчика не было конфликта.

  • Тот же процесс сделает Разработчик3 для избежания конфликта миграции.

Что такое "миграция слиянием"?

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

Что такое "миграция сквоша"?

Может возникнуть вопрос: сколько ненужных файлов будет создано для миграции?"

  • В файле миграции merge не было выполнено ни одной операции.
  • Могут быть таблицы, в которых вы добавили один столбец, затем удалили его, а затем снова добавили в таблицу, при этом могут быть созданы различные миграции. Основной целью сминания миграции является оптимизация файла миграции. Но перед сминанием миграции, пожалуйста, обратитесь к docs, так как в некоторых случаях это может быть громоздким или вызвать конфликт миграции.
  • .

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

Нет, в соответствии с приведенным выше примером использования миграции merge и squash, мы не можем сделать это на pipeline, так как ответственность разработчика за поддержание миграции в порядке, и согласно сообществу django все миграции должны быть синхронизированы в команде, поэтому мы не можем сделать это на pipeline.

Вернуться на верх