我有一个使用 Docker 部署的 Django-Postgres 应用程序。我有两个 docker 容器 web
和 db
以及一个用于持久存储的 docker volume。
我的 docker-compose.yml
文件:
version: '2'
services:
db:
image: postgres
ports:
- '5432:5432'
volumes:
- 'postgres:/var/lib/postgresql/data'
env_file: .env
web:
build: .
command: ./start.sh
volumes:
- .:/app
ports:
- "8000:8000"
depends_on:
- db
env_file: .env
volumes:
postgres:
我在我的 django model.py
中进行了更改:
class Meeting(models.Model):
[...]
participants = models.CharField(max_length=200)
到
class Meeting(models.Model):
[...]
user_participants = models.CharField(max_length=200)
但是,此更改未反射(reflect)在我的 Django 应用程序中,我收到以下错误:
column call_meeting.user_participants does not exist
我跑了:
python manage.py makemigrations call
python manage.py migrate
然后我尝试删除 Django 迁移并重新运行上述命令。我尝试重新运行 docker-compose build
但没有一个成功。
为什么会这样?我应该使用原始 SQL 更改列名吗?
最佳答案
根据您的问题和评论,我的印象是您的 django 没有使用正确的数据库。或者更有可能(而不是两个共存的数据库实例),即使 docker-compose 文件看起来不像它,也会在每次 docker 重新启动时重新创建数据库。
我们正在使用适合我们的类似设置,但数据量的装载方式不同 - 因此这可能是这里的问题:
- ./pgdata:/var/lib/postgresql/data/pgdata
设置.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ.get('POSTGRES_DB', 'my_db'),
'HOST': os.environ.get('POSTGRES_HOST', 'localhost'),
'PORT': os.environ.get('POSTGRES_PORT', '5432'),
'USER': os.environ.get('POSTGRES_USER', 'my_user'),
'PASSWORD': os.environ.get('POSTGRES_PASSWORD', 'my_password'),
'CONN_MAX_AGE': 120
}
}
docker-compose.yml
version: '2'
services:
postgres:
image: postgres:9.5
volumes:
- ./pgdata:/var/lib/postgresql/data/pgdata
environment:
- PGDATA=/var/lib/postgresql/data/pgdata
- POSTGRES_DB=<name> #django.settings.DATABASES['default']['NAME']
- POSTGRES_USER=<user> #django.settings.DATABASES['default']['USER']
- POSTGRES_PASSWORD=<password> #django.settings.DATABASES['default']['PASSWORD']
ports:
- 5432:5432
web:
depends_on:
- postgres
volumes:
- .:/app
environment:
- POSTGRES_HOST=postgres
- POSTGRES_DB=<host> # no need if settings.py is fine
- POSTGRES_USER=<user> # no need if settings.py is fine
- POSTGRES_PASSWORD=<password> # no need if settings.py is fine
build: .
ports:
- 8000:8000
command: ./start.sh
关于Django 模型更改未反射(reflect)在 Postgres Docker 容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41959022/