Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用mongodb作为django应用程序的第二个数据库_Django_Mongodb_Djongo - Fatal编程技术网

使用mongodb作为django应用程序的第二个数据库

使用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

我正在尝试为我的django应用程序设置两个数据库。第一个用于用户,第二个用于任何类型的用户内容。应用程序通过docker compose进行停靠

这是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')
当我尝试将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连接到数据库