首页 > 解决方案 > 如何为 django 项目修改多个数据库的 docker 设置?

问题描述

我的开发文件如下:

version: '3'

services:
  db:
    image: mdillon/postgis
    container_name: sl_database
    ports:
      - "5432:5432"
    volumes:
      - db_vesatogo_starling_v1:/var/lib/postgresql/data
    env_file:
      - ./config/dev.env
    networks: 
      - db_network

  db-replica:
    image: mdillon/postgis
    container_name: sl_database_replica
    ports:
      - "5433:5432"
    volumes:
      - db_vesatogo_starling_v1_replica:/var/lib/postgresql/data
    env_file:
      - ./config/dev1.env
    networks: 
      - db_network

  pgadmin:
    image: dpage/pgadmin4:4.28
    container_name: sl_admin
    links:
      - db
      - db-replica
    depends_on:
      - db
      - db-replica
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@admin.com
      PGADMIN_DEFAULT_PASSWORD: password
    ports:
      - "80:80"
      - "81:80"
    networks: 
      - db_network

networks:
  db_network:
    driver: bridge

volumes:
  db_vesatogo_starling_v1:
  db_vesatogo_starling_v1_replica:
  static:

现在,我在我的设置中引入了一个副本数据库。我的数据库设置如下:

DATABASES = {
    "default": {
        "ENGINE": "django_tenants.postgresql_backend",
        "NAME": os.environ.get("POSTGRES_DB", "starling"),
        "USER": os.environ.get("POSTGRES_USER", "user"),
        "PASSWORD": os.environ.get("POSTGRES_PASSWORD", "password"),
        "HOST": os.environ.get("POSTGRES_HOST", "db") if VT_ENV in PROD_ENV_TAGS else "localhost",
        "PORT": os.environ.get("POSTGRES_PORT", 5432),
        "TEST": {"NAME": os.environ.get("POSTGRES_TEST_DB", "starling_test")},
    },
    "replica": {
        "ENGINE": "django_tenants.postgresql_backend",
        "NAME": os.environ.get("POSTGRES_DB", "starling_replica"),
        "USER": os.environ.get("POSTGRES_USER", "user"),
        "PASSWORD": os.environ.get("POSTGRES_PASSWORD", "password"),
        "HOST": os.environ.get("POSTGRES_HOST", "db") if VT_ENV in PROD_ENV_TAGS else "localhost",
        "PORT": os.environ.get("POSTGRES_PORT", 5433),
        "TEST": {"NAME": os.environ.get("POSTGRES_TEST_DB", "starling_test")},
    },
}

在这些配置之后,当我运行查询时(例如:Table.objects.using("replica").all()),我收到以下错误:django.db.utils.ProgrammingError: column COLUMN_NAME 不存在。是的,我已经正确完成了所有迁移!请建议我应该进行哪些更改?

标签: pythondjangopostgresqldocker

解决方案


  1. 保持服务名称不同,例如 db:
  2. 使用单独的主机端口,但保持相同的容器端口“HOST_PORT:5432”
  3. 为这些副本创建不同的卷。

有了这3点,我想你什么都不需要担心。

这是额外的:您的 db 和 pgadmin 服务在同一个网络上,因此它们可以相互通信。但是其他两个服务无法访问redis服务。要解决此问题,请将 redis_network 添加到 pgadmin(假设 pgadmin 是访问点)


推荐阅读