如何用Docker-Compose在Django应用中创建双数据库并解决db2连接问题
问题解决方案
一、修复pgAdmin无法连接db2的问题
你的Docker-Compose配置中db2的端口映射存在错误,这是导致连接失败的核心原因:
- Postgres容器默认内部监听端口为
5432,你当前配置的ports: - "5433:5433"错误映射了端口,应修改为:db2: container_name: database2 image: postgres:14.4 restart: unless-stopped ports: - "5433:5432" # 宿主机5433端口映射到容器内默认的5432端口 environment: POSTGRES_DB: postgres POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres - 连接配置注意事项:
- 由于pgAdmin与db2处于同一Docker网络中,在pgAdmin添加服务器时,主机地址填容器名
database2,端口填5432(而非宿主机映射的5433); - 若从宿主机直接用psql连接db2,才使用
localhost:5433。
- 由于pgAdmin与db2处于同一Docker网络中,在pgAdmin添加服务器时,主机地址填容器名
- 验证操作:修改配置后执行
docker-compose down && docker-compose up -d重启容器,再重新在pgAdmin中配置db2的连接信息。
二、Django中使用Docker-Compose配置双数据库
1. 配置Django数据库连接
在项目的settings.py中添加双数据库配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', 'PASSWORD': 'postgres', 'HOST': 'db1', # 对应docker-compose中的db1服务名 'PORT': '5432', }, 'db2': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', 'PASSWORD': 'postgres', 'HOST': 'db2', # 对应docker-compose中的db2服务名 'PORT': '5432', } }
2. (可选)配置数据库路由自动分配
如果需要将特定App的模型自动关联到db2,可在项目根目录创建routers.py:
class DB2Router: def db_for_read(self, model, **hints): # 指定目标App使用db2读取数据 if model._meta.app_label == 'your_target_app': return 'db2' return 'default' def db_for_write(self, model, **hints): # 指定目标App使用db2写入数据 if model._meta.app_label == 'your_target_app': return 'db2' return 'default' def allow_relation(self, obj1, obj2, **hints): return True def allow_migrate(self, db, app_label, model_name=None, **hints): # 指定目标App的迁移操作在db2执行 if app_label == 'your_target_app': return db == 'db2' return db == 'default'
然后在settings.py中添加路由配置:
DATABASE_ROUTERS = ['your_project_name.routers.DB2Router']
3. 执行数据库迁移
- 迁移默认数据库:
python manage.py migrate - 迁移db2数据库:
python manage.py migrate --database=db2
4. 手动指定数据库操作(无路由时)
如果未配置路由,可在代码中手动指定操作的数据库:
# 从db2读取数据 MyModel.objects.using('db2').all() # 将数据保存到db2 obj.save(using='db2')
内容的提问来源于stack exchange,提问作者aba2s
相关产品推荐
相关产品推荐

