【问题标题】:Django Multiple Databases - One not always availableDjango 多个数据库 - 一个并不总是可用
【发布时间】:2011-06-24 03:16:52
【问题描述】:

我正在开发一个将使用多个数据库后端的 Django 应用程序。我想在运行 django 应用程序的机器上放置一个 sqlite 数据库,并同步到远程 mysql 数据库。棘手的部分是运行应用程序的这台机器并不总是有互联网连接,因此 mysql 数据库并不总是可用的。会有多台机器运行应用程序,每台机器都有自己的本地 sqlite 数据库,但都使用相同的远程 mysql 数据库。

我还没有编写代码,但这是我的想法。每次我运行插入或更新时,我都想将它写入两个数据库,除非远程数据库不可用,在这种情况下,我会将 sql 语句保存在本地数据库的表中,以便在远程数据库可用时运行。

这可以通过数据库路由器来完成,还是我需要用每个 db 语句手动实现?

PK注意事项:没有直接关系,但一定会被问到。主键将在每台机器上本地生成。在 mysql 数据库中,该键将有一个字段,应用程序的每个实例都有一个具有唯一标识符的字段,它们共同提供一个唯一键。

【问题讨论】:

    标签: django synchronization sync multiple-databases


    【解决方案1】:

    假设您有一个名为 Blog 的模型,那么您可以使用以下内容在本地和远程存储它(假设您已配置对远程数据库的访问)。

    blog = Blog('test') 
    blog.save() #Assuming that sqlite is the default db
    try:
        blog.save(using='mysql')
    except NoInternetConnection:
        pass
    

    确保您已在 settings.py 中定义和配置了“mysql”,并确保您处理没有 Internet 连接的情况。

    旁注:我不太确定您为什么要这样做。如果这是出于备份目的,那么我将使用标准备份程序。有关使用多个数据库的更多信息,请参阅:http://docs.djangoproject.com/en/dev/topics/db/multi-db/#using-raw-cursors-with-multiple-databases

    【讨论】:

    • 感谢您的回复。这是一个很好的简单解决方案。我将编写一个函数,它将对任何模型使用这种格式。作为对您的旁注的回应,我将在信息亭机器上本地运行几个应用程序,这些应用程序没有可靠的互联网连接。然后,我需要将所有机器的数据聚合到 Web 服务器上。
    • 不客气,如果你喜欢这个答案并且它解决了你的问题,你可以选择这个作为解决方案吗?
    【解决方案2】:

    我获取了 DrDee 的代码并将其附加到 post_save 信号(+1 以获得帮助)。

    @receiver(models.signals.post_save) #new signal decorator in Django 1.3
    def save_to_remote(sender,instance,using,**kwargs):
        if using == 'default' and instance.__module__ == 'mymodel.myapp.models':
            try:
                instance.save(using='remote')
            except:
                pending_instance=Pending_Remote(
                                                pk_default=instance.pk,
                                                model_default=instance.__class__.__name__
                                                )
                pending_instance.save()
    

    这还会保存未保存到远程数据库的记录。请注意,模型 Pending_Remote 不得在“myapp”中。

    【讨论】:

    • 如果有人可以为 django 和 postgres 制作这样的应用程序,那就太棒了。
    猜你喜欢
    • 2014-06-07
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2012-09-09
    • 2011-02-23
    • 2013-04-26
    • 2010-09-06
    相关资源
    最近更新 更多