Миграции Django для контейнера docker

#django #postgresql #docker #django-models #docker-compose

#django #postgresql #docker #django-модели #docker-compose

Вопрос:

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

В принципе, у меня есть веб-сайт, на котором работает django / postgres / nginx, он работает без сбоев, и я могу создавать новые модели и переносить их, но если я попытаюсь добавить поле в модель:

 from django.db import models

class project(models.Model):
    project_name = models.CharField(max_length=50)
    author = models.CharField(max_length=30, blank=True, null=True)
    date_created = models.DateField()
    #Added in second round of migrations 
    #Description = models.CharField(max_length=150,blank=True, null=True)
 

Обычно я сначала собираю и разворачиваю свой контейнер

 sudo docker-compose -f docker-compose.yml up --build
 

И в моем файле entrypoint я запускаю makemigrations и выполняю миграцию.

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

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

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

Ответ №1:

makemigrations должно быть выполнено на этапе разработки и добавить файлы переноса (файлы с префиксом 000x) в систему управления версиями.

Затем, после нескольких изменений, у вас должно получиться что-то вроде:

 0001_first_round_change.py
0002_second_round_change_for_description.py
......
 

Каждый раз, когда при запуске контейнера docker выполняется миграция этих файлов, полезную процедуру для этой операции можно увидеть в командах Django: makemigrations или migrate?

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

Комментарии:

1. Ага, хорошо, это действительно имеет для меня большой смысл. Итак, чтобы быть полностью уверенным, в настоящее время я запускаю свой postgres локально как сервис в моем файле docker-compose. При других обстоятельствах, я думаю, я бы просто запустил разработку вне контейнера, но при этом сохранил доступ к RDS, размещенному, например, на amazon. Значит, я все еще могу работать с базой данных в dev?

2. Я не уверен, что понимаю вас. Я понимаю, что фаза разработки может быть независимой от фазы операций. Просто позаботьтесь о каждом изменении структуры базы makemigrations данных. Затем в рабочей среде просто сделайте migrate для всех файлов миграции, если db изменится, команда просто пропустит это, вот так . Таким образом, разработка в локальном режиме позволяет использовать локальный контейнер, также можно не использовать контейнер в локальном режиме, просто зависит от вашей привычки к разработке. Сначала проведите эксперимент для себя, может быть, лучше…

Ответ №2:

  1. migrate Операция опасна, и вы никогда не должны делать это автоматически.
  2. Рекомендуемое поведение файла entrypoint по умолчанию — запуск вашего сервера приложений.
  3. Если вы хотите перенести свою базу данных, попробуйте docker exec выполнить команду в контейнере.

Комментарии:

1. Спасибо за рекомендации, я удалю миграцию из файла entrypoint и буду помнить о рекомендуемом поведении. Однако я пытался запустить эту exec команду раньше, но это все равно не решит проблему удаления миграций при каждой перестройке модели. В настоящее время я изменяю модели после запуска, и когда я запускаю и создаю любой makemigration вызов, который я делаю, не сохраняется на моем локальном компьютере

2. @AlexS вы должны запустить makemigration на своем локальном компьютере и добавить файлы миграции в git. см. docs.djangoproject.com/en/3.1/topics/migrations/#workflow