使用mongodb作为django应用程序的第二个数据库
我正在尝试为我的django应用程序设置两个数据库。第一个用于用户,第二个用于任何类型的用户内容。应用程序通过docker compose进行停靠 这是docker-compose.yaml文件使用mongodb作为django应用程序的第二个数据库,django,mongodb,djongo,Django,Mongodb,Djongo,我正在尝试为我的django应用程序设置两个数据库。第一个用于用户,第二个用于任何类型的用户内容。应用程序通过docker compose进行停靠 这是docker-compose.yaml文件 version: '3' services: postgres: image: postgres:latest environment: - POSTGRES_PASSWORD=test ports: - "5432:5432" restar
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')
当我尝试将post插入数据库时,浏览器中出现以下错误
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以便使用它们吗。
最初,我尝试在没有默认db和自定义路由器的情况下运行应用程序,但随后恢复到该状态,以便正确配置一个非默认db。
我还尝试清除整个docker卷和迁移,并从头开始运行它以应用迁移,但我仍然无法使其正常工作。您好,要使用两个数据库,您需要这个。有关Django中多个数据库的更多信息,请阅读文档。 如果我的回答是好的和有帮助的,选择作为回答
DATABASES = {
'default': {},
'users': {
'NAME': 'user_data',
'ENGINE': 'django.db.backends.mysql',
'USER': 'mysql_user',
'PASSWORD': 'superS3cret'
},
'customers': {
'NAME': 'customer_data',
'ENGINE': 'django.db.backends.mysql',
'USER': 'mysql_cust',
'PASSWORD': 'veryPriv@ate'
}
}
正在同步数据库»
migrate management命令一次操作一个数据库。默认情况下,它在默认数据库上运行,但通过提供--database选项,您可以告诉它同步不同的数据库。因此,要将上述第一个示例中的所有模型同步到所有数据库,您需要调用:
$ ./manage.py migrate
$ ./manage.py migrate --database=users
如果不希望每个应用程序都同步到特定的数据库上,可以定义一个数据库路由器,该路由器实现一个限制特定模型可用性的策略
如上面第二个示例所示,如果默认数据库为空,则必须在每次运行migrate时提供数据库名称。省略数据库名称将引发错误。关于第二个例子:
$ ./manage.py migrate --database=users
$ ./manage.py migrate --database=customers
有关多个数据库的更多信息,请阅读此。您好,DevGUL,我不明白当我一次迁移一个数据库时,如何指定哪些模型到哪个数据库?我应该指定数据库,如manage.py migrate yourapp--databasename databaseususer您不能指定模型,您必须指定app。因为这将是一个结构错误,你需要导入和重新导入很多东西,所以它会非常难看。你会误解你的代码。只需将python3 makemigrations写入您的应用程序,然后python3迁移您的应用程序——yourDB=DBuserplus别忘了您必须通过setting.py连接到数据库