Django模型更改未反映在Postgres Docker容器上

时间:2017-01-31 13:38:26

标签: django postgresql docker docker-compose django-1.10

我有一个部署了Docker的Django-Postgres应用程序。我有两个docker容器webdb以及一个用于持久存储的docker卷。

我的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)

但是,这个更改没有反映在我的Django应用程序上,我收到以下错误:

  

列call_meeting.user_participants不存在

我跑了:

python manage.py makemigrations call
python manage.py migrate

然后我尝试删除Django迁移并重新运行上述命令。我试图重新运行docker-compose build,但没有一个工作。

为什么会这样?我应该用原始SQL更改列名吗?

1 个答案:

答案 0 :(得分:0)

从您的问题和评论中,我得到的印象是您的django没有使用正确的数据库。或者更可能(而不是两个共存的数据库实例),即使docker-compose文件看起来不像它,也会在每个docker重新启动时重新创建数据库。

我们正在使用类似的设置,这对我们有用,但数据量的安装方式不同 - 所以这可能是问题所在:

- ./pgdata:/var/lib/postgresql/data/pgdata

settings.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
    }
}

搬运工-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