Djang中的单模型动态数据库设置

2024-06-11 08:22:53 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,假设我有100个使用WordPress的客户机,我必须用Django编写一个服务,它应该从WordPress的MySQL数据库中返回posts的列表。问题是100个客户端有不同的数据库连接设置。在

我知道我可以使用DatabaseRouter来切换已加载到设置中的数据库。但是我不知道如何使一个单个模型类使用不同的数据库设置。在

  • 我试过改变设置。在
  • 我还尝试了突变模型的app_label。在

但后来我明白了,在Django中改变anyting意味着更少。在

我的要求

我想创建一个模型并动态更改数据库连接。连接列表可以在managed数据库表中。但我不想不必要地加载所有连接设置或创建多个模型。在


Tags: django模型数据库app客户端列表客户机mysql
2条回答

我做了一些类似的事情,但是为了改变mongodb的连接。 我创建了一个GenericView来选择连接并在getqueryset上使用它。在

我使用的是django rest框架,所以我做了这样的事情:

class SwitchDBMixinView(object):
    model = None
    fields = None

    def initial(self, request, *args, **kwargs):
        result = super().initial(request, *args, **kwargs)
        if request.user.is_authenticated():
            request.user.database_connection.register()
        return result

    def get_object(self, *args, **kwargs):
        return super().get_object(*args, **kwargs).switch_db(self.get_db_alias())

    def get_db_alias(self):
        if self.request is None or not self.request.user.is_authenticated():
            return DEFAULT_CONNECTION_NAME
        return self.request.user.database_connection.name

    def get_queryset(self):
        return self.model.objects.using(self.get_db_alias()).all()

    def perform_destroy(self, instance):
        instance.switch_db(self.get_db_alias()).delete()

模型:

^{pr2}$

您可能想看看django.db.connections(在django/db/__init__.py)和{}(这是{}的一个实例)。这将允许您动态地添加新的数据库配置,而无需对settings.DATABASES(实际上,ConnectionHandlersettings.DATABASES构建它的_databases属性)。我不能肯定,因为我从来没有试过,但它应该归结为

from django import db

def add_db(alias, connection_infos):
    databases = db.connections.databases
    if alias in databases:
        either_raise_or_log_and_ignore(your choice)
    db.connections.databases[alias] = connection_infos

其中connection_infos是与settings.DATABASES中预期的映射类似的映射。在

然后主要是使用Queryset.using(alias)进行查询,即:

^{pr2}$

cfhttps://docs.djangoproject.com/en/1.11/topics/db/multi-db/#manually-selecting-a-database

这个IMHO的主要问题(假设您设法根据上述未经测试的建议进行了一些工作)是,您必须将数据库用户/密码存储在清晰的地方,这可能是一个主要的安全问题。我不知道你在数据库管理部分有多大的控制权,但是如果你能在所有这些数据库上添加一个具有相同密码(当然还有适当权限)的“django”用户,这样你就可以将密码保存在设置文件中,而不必将其保存在主数据库中。在

相关问题 更多 >