Django 模型更改未反射(reflect)在 Postgres Docker 容器中

标签 django postgresql docker docker-compose django-1.10

我有一个使用 Docker 部署的 Django-Postgres 应用程序。我有两个 docker 容器 webdb 以及一个用于持久存储的 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/

相关文章:

python - 如何将 'next' 参数传递给 Django Auth logout_then_login View ?

postgresql - 创建引用不存在的表或列的 SQL 函数(尚)

postgresql - PostgreSQL 中的 RFC3339 格式

sql-server - 从 docker 中的脚本创建 SQL Server 数据库

python - 在基于类的 View (CBV) 中引用当前用户

python - Django休息框架: how to get the current superuser in serialize?

python - Django 静态文件 - CSS 文件无法加载

json - Postgres 10,从包含json对象数组的json对象中选择

docker - Docker exec npm命令

docker - 如何在 docker 构建过程中使用环境变量获取脚本?