Картина сцена: это 11 вечера и производство падает. Стресс Вы собираетесь откатиться к последнему хорошему выпуску. Все, что вам нужно, это обратить вспять миграции базы данных, а затем развернуть и … Подожди, что?
$ python manage.py migrate hounds 0002 Operations to perform: Target specific migration: 0002_auto, from hounds Running migrations: Rendering model states... DONE Unapplying hounds.0003_auto...Traceback (most recent call last): django.db.migrations.exceptions.IrreversibleError: Operationin hounds.0003_auto is not reversible
Миграции вперед и назад
Данные Django Migrations являются двумя участниками: вперед и назад, но причина этой неудачной миграции – это … по причинам … Разработка только добавлена только вперед
обработчик:
# 0003_auto.py def forwards(apps, schema_editor): ... class Migration(migrations.Migration): dependencies = [("cases", "0009_auto_20200320_1210")] operations = [migrations.RunPython(forwards)]
Django требует вперед, но назад технически необязательно. Хотя вышеизложенное действительно, ниже бесконечно лучше:
# 0003_auto.py def forwards(apps, schema_editor): ... def backwards(apps, schema_editor): ... class Migration(migrations.Migration): dependencies = [("cases", "0009_auto_20200320_1210")] operations = [migrations.RunPython(forwards, backwards)]
Итак, назад
это технически Необязательно то же самое, что ношение парашюта во время прыжки с парашютом является необязательным: достаточно времени, когда вы в конечном итоге попадут на землю. Жесткий. Действительно, если вы хотите, чтобы вариант отказаться от вашего производственного сайта, то нет, назад
не является обязательным. Опущение назад
означает, что у вас есть только опция прокат вперед , который немного больше сложно по сравнению с безопасным возвратом к высвобождению Мы знать работает.
Исправление тоже очень простое: просто указав Миграция. Munpython.noop
может быть достаточно. Как подразумевает название, Django будет ничего не делай Для обратного, просто пропустите миграцию данных, не бросая IrrooversibleError
:
# 0003_auto.py class Migration(migrations.Migration): dependencies = [("cases", "0009_auto_20200320_1210")] operations = [migrations.RunPython(forwards, migrations.RunPython.noop)]
Так что на практике следуйте этим советам:
Есть ли у вашей кодовой базы IrrooversibleErr ждет, чтобы произойти?
Со временем легко проскользнуть в вашей кодовой базе. У вас может быть необратимая миграция в вашей кодовой базе. Я могу проверить это для вас в django.doctor или может Просмотрите свой GitHUB PRS :
Или попробуйте Рефакторы Django Challenges Отказ
Оригинал: “https://dev.to/djangodoctor/the-hidden-django-anti-pattern-preventing-your-prod-rollback-fjd”