python - 如何为 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 不存在。是的,我已经正确完成了所有迁移!请建议我应该进行哪些更改?
解决方案
- 保持服务名称不同,例如 db:
- 使用单独的主机端口,但保持相同的容器端口“HOST_PORT:5432”
- 为这些副本创建不同的卷。
有了这3点,我想你什么都不需要担心。
这是额外的:您的 db 和 pgadmin 服务在同一个网络上,因此它们可以相互通信。但是其他两个服务无法访问redis服务。要解决此问题,请将 redis_network 添加到 pgadmin(假设 pgadmin 是访问点)
推荐阅读
- python - Python相当于Excel Solver:获取最大值知道约束
- python - 如何给excel单元格赋值?
- python - 如何避免鼠标事件被QGraphicsView吃掉
- react-native - 如何将参数传递给深度反应导航堆栈导航器
- ios - 从另一个 UIViewController 的 UITableView 获取 UITableViewCell
- c - 如何在不更改 C 中的原始数组的情况下对指针数组进行排序
- bash - 删除除一个(或多个)以外的所有文件夹
- javascript - 获取最新的副本并将其通过电子邮件发送给自己
- f# - 'let' 之后的块未完成 - try/with
- java - 访问 RESTful Web 服务的问题