#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:
migrate
Операция опасна, и вы никогда не должны делать это автоматически.- Рекомендуемое поведение файла entrypoint по умолчанию — запуск вашего сервера приложений.
- Если вы хотите перенести свою базу данных, попробуйте
docker exec
выполнить команду в контейнере.
Комментарии:
1. Спасибо за рекомендации, я удалю миграцию из файла entrypoint и буду помнить о рекомендуемом поведении. Однако я пытался запустить эту
exec
команду раньше, но это все равно не решит проблему удаления миграций при каждой перестройке модели. В настоящее время я изменяю модели после запуска, и когда я запускаю и создаю любойmakemigration
вызов, который я делаю, не сохраняется на моем локальном компьютере2. @AlexS вы должны запустить
makemigration
на своем локальном компьютере и добавить файлы миграции в git. см. docs.djangoproject.com/en/3.1/topics/migrations/#workflow