Django multidb:写入多个数据库

2024-06-17 18:57:19 发布

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

使用Django multidb,编写运行主/从基础设施的router相当容易。但是,有没有可能编写一个路由器,将写入多个数据库?我的用例是一组项目,它们都运行在同一个域上。为了避免用户在每个站点上注册/登录,我想同步contrib.auth和{}表。Django multidb有可能吗?还是应该研究一下数据库系统(在我的例子中是MySQL)的复制特性?在


Tags: 项目django用户auth数据库站点mysql基础设施
3条回答

首先,我认为您需要更多的是一个SSO框架,比如in this post

我试过穆阿德的答案,但我无法让班级装饰师工作。。。在我看来,这个解决方案不允许在模型中使用自定义save()。在

更适合我的需要,我定义了一个自定义泛型类并简单地重写save()函数。在

class MultiDbModel(models.Model):
    class Meta:
        abstract = True

    def save(self, *args, **kwarg
        for dbname in settings.DATABASES:
            super(MultiDbModel, self).save(using=dbname)

然后:

^{pr2}$

我现在正在研究Django切分模式。在

我看了看Django路由器,但决定自己动手。在

关于您的问题的一些想法:

  1. 一种想法是使用一个数据库,然后在保存后使用Django信号复制适当的数据。在

有点像

import settings.databases as dbs_list

def post_save_function(UserModel):
     for db in dbs_list:
          UserModel.save(using=db,force_insert=True)

保存用户对象(至少在一个DB模型上)似乎是通过内部发生的各种魔法在幕后保存会话、身份验证等数据django.contrib公司,因此,您可能不必进入并找出所有这些数据库表的名称和类型。在

为了支持这种工作的可能性,我发誓我最近在某个地方读到(可能是在Alex Gaynor的一篇博客文章中),如果一个对象有外键Django将尝试使用该对象所在的同一个DB(从Django通常的操作方式来看,原因很明显)。在

  1. 另一个想法是:

从您引用的Django multiDB页面上的示例中,我想知道下面这样的方法是否可行:

他们的示例代码:

^{pr2}$

可能的修改:

def allow_syncdb(self,db,model):

    if isinstance(model,User):
         return True

    elif isinstance(model,Session):
         return True

    else:
         ''' something appropriate  
             whatever your sharding schema is for other objects '''

再看一看,这个代码作为“db_for_write”函数可能更有用。但你明白了。在

毫无疑问,这是其他类型的作品。在

祝你好运!希望这对你有所帮助。在

我对你的发现和评论很感兴趣!在

jb

我认为您最好实现SSO或OAuth服务

但是如果您想在两个数据库之间同步表用户,并且您使用自己的UserModel,您可以这样做

class MyUser(models.Model):
    name = models.CharField(max_length=100)
    user = models.ForeignKey(User, unique=True)


    def save(self, ...): # ALL the signature
        super(MyUser, self).save(using='database_1')
        super(MyUser, self).save(using='database_2')

您也可以使用这样的decorator,像这样您也可以使用它来同步其他表:

^{pr2}$

希望这会有帮助:)

相关问题 更多 >