Проблемы миграции django с postgres
Я работаю над проектом Django, который докеризирован и использует Postgres для базы данных, но мы столкнулись с проблемой миграций, Каждый раз, когда кто-то вносит изменения в модель, если другой разработчик берет из git и пытается перенести миграции, используя python manage.py migrate, потому что у нас уже есть файл миграций, иногда возникает ошибка table already exists или table doesn't exists, поэтому каждый раз мне нужно применять миграции, используя --fake, но я думаю, что это не очень хороший подход, чтобы мигрировать каждый раз, используя флаг --fake.
docker-compose.yml
version: "3.8"
services:
db:
container_name: db
image: "postgres"
restart: always
volumes:
- postgres_data:/var/lib/postgresql/data/
env_file:
- dev.env
ports:
- "5432:5432"
environment:
- POSTGRES_DB=POSTGRES_DB
- POSTGRES_USER=POSTGRES_USER
- POSTGRES_PASSWORD=POSTGRES_PASSWORD
app:
container_name: app
build:
context: .
command: bash -c "python manage.py runserver 0.0.0.0:8000"
volumes:
- ./core:/app
- ./data/web:/vol/web
env_file:
- dev.env
ports:
- "8000:8000"
depends_on:
- db
volumes:
postgres_data:
Dockerfile
FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /app
EXPOSE 8000
COPY ./core/ /app/
COPY ./scripts /scripts
# installing nano and cron service
RUN apt-get update
RUN apt-get install -y cron
RUN apt-get install nano
RUN pip install --upgrade pip
COPY requirements.txt /app/
# install dependencies and manage assets
RUN pip install -r requirements.txt && \
mkdir -p /vol/web/static && \
mkdir -p /vol/web/media
# files for cron logs
RUN mkdir /cron
RUN touch /cron/django_cron.log
# start cron service
RUN service cron start
RUN service cron restart
RUN chmod +x /scripts/run.sh
CMD ["/scripts/run.sh"]
run.sh
#!/bin/sh
set -e
ls -la /vol/
ls -la /vol/web
whoami
python manage.py collectstatic --noinput
python manage.py migrate
service cron start
service cron restart
python manage.py crontab add
printenv > env.txt
cat /var/spool/cron/crontabs/root >> env.txt
cat env.txt > /var/spool/cron/crontabs/root
uwsgi --socket :9000 --workers 4 --master --enable-threads --module alectify.wsgi
Django предлагает возможность создавать обновленные миграции, когда модели меняются, смотрите https://docs.djangoproject.com/en/4.0/topics/migrations/#workflow для более подробной информации, но вы можете генерировать и затем применять обновленные миграции, используя:
python manage.py makemigrations
python manage.py migrate