我有 3 个不同的 Django 项目(或实例)在同一 Ubuntu 服务器(针对同一用户)的不同文件夹中运行。我们将这些实例称为(D1、D2、D3)。 3个项目都使用sqlite3作为数据库。
所有 3 个项目除了它们固有的差异之外,还有一个共同的 django 模型,称为“Word”(基本上负责存储单词图像)。在任何给定时间,每个 django 项目都可能有数百万个单词模型条目。
我遇到的问题是我需要经常将单词实例从一个项目转移到另一个项目。待传输的单词量巨大(每天数百万个单词模型实例)。
我目前的解决方案效率很低,我正在做的是将所有单词条目从D1项目导出到单个文件夹,然后将所有条目从该文件夹导入到D2项目。
有没有什么方法可以为“Word”模型创建一个所有3个项目都可以访问的通用数据库?这将使将单词从 D1 转移到 D2 的位置变得更加容易,我只需将所有相关单词中的一个字段(可能属于_to)从“D1”更改为“D2”即可。
任何有关如何实施此解决方案的帮助或解决此问题的其他想法将不胜感激。
-谢谢
您可以在项目中定义两个(或更多)数据库:
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'mydatabase',
},
'common': {
'ENGINE': 'django.db.backends.sqlite3',
'name': '/path/to/common/db',
},
}
您可以在所有 Django 应用程序中执行此操作,因此您可以在其中引用通用数据库,最好是另外两个 Django 应用程序之一的数据库。
现在的问题是我们如何让 Django 知道我们想要与该数据库“对话”。我们使用
.using(…)
指令[Django-doc] 来做到这一点。所以我们可以合作:
words = Word.objects.using('common')
这将使 Django 使用
common
数据库而不是 default
数据库。
这可能有点烦人,因为我们每次都需要使用它。解决方案是与自定义管理器合作
objects
:
class WordManager(models.Manager):
def get_queryset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).using('common')
class Word(models.Model):
# …
objects = WordManager()
所以现在当我们使用
Word.objects.all()
时,它将被路由到 /path/to/common/db.sqlite
数据库。
话虽这么说,使用不同的数据库有一些缺点,最臭名昭著的一个是我们无法对不同数据库中的表进行 JOIN。所以这不是一个“银弹”解决方案。