django - 对多个数据库配置的困惑
问题描述
我正在尝试使用多个数据库,其中一个数据库是默认数据库,第二个数据库是 :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 数据库检索的对象将保存在同一数据库中)。默认路由方案确保如果未指定数据库,所有查询都回退到默认数据库。
解决方案
是的,您需要使用路由器。那是 Django 用于决定应将哪个数据库用于给定操作的机制。能够在代码中指定这一点比简单的映射更强大和灵活。
如果映射可以满足您的需求,那么您可以自己实现该功能;或者也许已经有一个第三方应用程序。DATABASE_APPS_MAPPING
不是 Django 设置,这就是为什么有人必须编写路由器来使用该值的原因。
推荐阅读
- scrapysharp - 使用 ScrapySharp 和 HtmlAgilityPack 抓取表格
- c++ - 我应该在堆上创建一个新的 QDomDocument 吗?
- deployment - ssas 表格项目属性不显示查询模式
- python-2.7 - 为什么我的列表变成了一个 int 以及如何解决它
- laravel - 如果页面重新加载后数据消失,如何更新组件?
- c# - 为什么 C# 编译器不优化简单的 async/await 方法
- javascript - 如何从正则表达式替换中省略特定字符串?
- android - Android - 在后台杀死相机进程
- .net - 有没有办法在 Visual Studio 2019 中发布 .NET 标准库而不生成 .nupkg?
- python - 向量化一个模糊图像的 Python 函数