【问题标题】:Specify database to use in Django指定要在 Django 中使用的数据库
【发布时间】:2013-11-26 16:57:36
【问题描述】:

我的 django 项目需要使用多个数据库。当只有一个数据库时,应用程序可以正常工作:

在setting.py中

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',                     
        'USER': 'root',
        'PASSWORD': '',
        'HOST': '127.0.0.1',                     
        'PORT': 3306,    
    },

但如果我从同一个引擎添加更多数据库:

DATABASES = {
    'default':{},
    'mydb1': {
            'ENGINE': 'django.db.backends.mysql', 
            'NAME': 'mydb1',    
            'USER': 'root',
            'PASSWORD': '',
            'HOST': '127.0.0.1',                    
            'PORT': 3306,                  
        },
   'mydb2': {
            'ENGINE': 'django.db.backends.mysql', 
            'NAME': 'mydb2',           
            'USER': 'root',
            'PASSWORD': '',
            'HOST': '127.0.0.1',             
            'PORT': 3306,                   
                }
    }

它给了我以下错误:

ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.

另外,我试过了:

DATABASES = {
        'default': {
                'ENGINE': 'django.db.backends.mysql', 
                'NAME': 'mydb1',    
                'USER': 'root',
                'PASSWORD': '',
                'HOST': '127.0.0.1',                    
                'PORT': 3306,                  
            },
       'mydb2': {
                'ENGINE': 'django.db.backends.mysql', 
                'NAME': 'mydb2',           
                'USER': 'root',
                'PASSWORD': '',
                'HOST': '127.0.0.1',             
                'PORT': 3306,                   
                    }
        }

它只看到 mydb1,而不是 mydb2,当我尝试查询 mydb2 时,它给了我:

DoesNotExist: Site matching query does not exist.

我需要定义数据库路由吗?看来我只需要为自定义读/写这样做。

谢谢

更新:

在 django 文档中,它说“默认路由方案确保如果未指定数据库,所有查询都回退到默认数据库”。

所以我想我的实际问题是如何指定用于查询的数据库?

【问题讨论】:

    标签: python django multiple-databases django-settings


    【解决方案1】:

    docs中有明确说明

    DATABASES 设置必须配置一个默认数据库;任意数量的 也可以指定其他数据库。

    如果默认数据库的概念在上下文中没有意义 在您的项目中,您需要注意始终指定数据库 你想使用的。

    在您的第二个示例中,默认数据库未配置

    DATABASES = {
         'default':{},
    ...
    }
    

    当您在未指定数据库的情况下访问您的数据时,将使用 django.db.backends.dummy 后端,这会在您的配置中报错 ImproperlyConfigured 错误。

    使用数据库路由器配置多个数据库使用的示例可以是found in docs

    更新

    站点匹配查询错误的原因完全不同,是另一个问题。在这里回答,因为它与许多其他数据库重复:由于您的 mysql1mysql2 dbs 有不同的内容,第二个似乎没有正确配置。参考site matching query does not exist

    【讨论】:

    • django docs 为多个数据库提供的第二个示例将其留空:docs.djangoproject.com/en/1.5/topics/db/multi-db
    • syncdb --databases=mydb2 时可以指定要更新的数据库,但是在访问数据时如何指定数据库?是在model.py中完成的吗?
    • @zyenge 在我的回答中看到最后一个文档链接,这无法在模型中完成,它是通过DATABASE_ROUTERS 设置完成的
    • 那么自定义db_for_read/write与否,有多个数据库时必须使用DATABASE_ROUTERS 必须?那是我最初的问题......
    • @zyenge 抱歉,我不明白So customized db_for_read/write or not, a database_route must be used when there are multiple databases? 的含义,并查看有关未定义站点的更新。
    猜你喜欢
    • 2015-08-27
    • 2020-07-12
    • 2011-06-16
    • 2020-03-03
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2018-02-06
    相关资源
    最近更新 更多