我正在尝试为我的 django 应用程序设置两个数据库。第一个用于用户,第二个用于任何类型的用户内容。该应用程序通过 docker compose 进行了 docker 化。
这是 docker-compose.yaml 文件
version: '3'
services:
postgres:
image: postgres:latest
environment:
- POSTGRES_PASSWORD=test
ports:
- "5432:5432"
restart: always
mongodb:
image: mongo:latest
command: ["--bind_ip_all"]
ports:
- "27017:27017"
restart: always
django:
build: .
command: bash -c "
python service_platform/manage.py makemigrations &&
python service_platform/manage.py migrate &&
python service_platform/manage.py runserver 0.0.0.0:8000
"
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- postgres
- mongodb
links:
- postgres
- mongodb
下面是django的settings.py的db设置
DATABASE_ROUTERS = [
'content_manager.content_db_router.ContentDBRouter',
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'HOST': 'postgres',
'PASSWORD': 'test',
'PORT': 5432,
},
'content': {
'ENGINE': 'djongo',
'NAME': 'mongodb',
'CLIENT': {
'host': 'mongodb',
'port': 27017,
},
}
}
这是我写的自定义路由器
class ContentDBRouter(object):
content_db = 'content'
default_db = 'default'
def db_for_read(self, model, **hints):
if model._meta.app_label == 'content_manager':
return self.content_db
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == 'content_manager':
return self.content_db
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if db == self.content_db:
return True
elif db == self.default_db:
return True
else:
raise Exception(f'DB with id {db} not found!')
最后这是我想要迁移到 mongo db 的模型
class Post(models.Model):
id = models.AutoField(primary_key=True)
title = models.TextField(default='default title')
当我尝试将帖子插入数据库时,我在浏览器中出现以下错误
MigrationError at /
Table content_manager_post does not exist in database
以及在使用 dbs 和 django 应用程序运行容器的终端中出现以下错误。
raise MigrationError(f'Table {collection} does not exist in database')
我能否获得一些帮助来正确配置 mongo 和 postgres 以便使用它们。最初,我尝试在没有默认数据库和自定义路由器的情况下为我拥有的每个模型运行应用程序,但随后恢复到此状态以正确配置一个非默认数据库。我还尝试清除整个 docker 卷和迁移并从头开始运行它以应用迁移,但我仍然没有设法让它工作。