首页 > 解决方案 > 对多个数据库配置的困惑

问题描述

我正在尝试使用多个数据库,其中一个数据库是默认数据库,第二个数据库是 :memory 数据库。根据文档中的描述(如下所示),听起来默认路由应该没问题。但它说这些对象对它们的原始数据库是“粘性的”。如何有“原始”数据库?

当我第一次开始实现这一点时,我预计 Model 类中会有一个 META 来指定其数据库,但事实似乎并非如此。我看到人们将应用程序映射到数据库的示例,这对我的场景来说是完美的,但随后他们转身写了一个路由。

我不想总是将数据库添加到 Save 调用中,因为这很容易出现编程错误。是否有将应用程序映射到数据库或模型到数据库的官方设置?还是总是需要编写一个路由器来使用多个数据库。

# Is DATABASE_APPS_MAPPING just a name that some developer chose to use or is it a
# real Django thing that would do what I want?
DATABASE_APPS_MAPPING = {'app1': 'default', 'app2': 'in_memory'}

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'in_memory': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': ':memory:',
    }
}

文档内容

使用多个数据库的最简单方法是设置数据库路由方案。默认路由方案确保对象对它们的原始数据库保持“粘性”(即,从 foo 数据库检索的对象将保存在同一数据库中)。默认路由方案确保如果未指定数据库,所有查询都回退到默认数据库。

标签: djangodjango-modelsdjango-orm

解决方案


是的,您需要使用路由器。那是 Django 用于决定应将哪个数据库用于给定操作的机制。能够在代码中指定这一点比简单的映射更强大和灵活。

如果映射可以满足您的需求,那么您可以自己实现该功能;或者也许已经有一个第三方应用程序。DATABASE_APPS_MAPPING不是 Django 设置,这就是为什么有人必须编写路由器来使用该值的原因。


推荐阅读