Django 副本数据保存到多个数据库

Posted

技术标签:

【中文标题】Django 副本数据保存到多个数据库【英文标题】:Django replica data save to many databases 【发布时间】:2020-05-11 03:50:35 【问题描述】:

从 django 文档中,可以从数据库创建副本并定义它将写入或读取的位置。 (django multiple-database)。

然后,它为它编写代码,配置我的DATABASE 像:

DATABASES = 
    'default': 
        'NAME': 'my_write_database',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'writedatabase',
    ,
    'replica': 
        'NAME': 'replica',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'readdatabase',
    ,

并创建路由器:

class ReplicaDatabaseWriteRead(object):

    route_app_labels = ..all_possible_applications

    def db_for_read(self, model, **hints):
        return 'replica' # O just wanna read from 'replica'

    def db_for_write(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'default' # I wanna write in default and 'reflect' to 'replica'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        db_list = (..all_possible_apps)
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return True

但这不能正常工作。当我写的时候,它只是写在default,不反映到replica。然后当我阅读replica 时,值不会退出。

他不应该在default中写入并复制replica中的值吗?我正在使用 django-rest-framework 这段代码与文档非常相似,我不知道有什么问题。还是我看不懂 django 文档?

【问题讨论】:

【参考方案1】:

Django 并没有为你解决复制的问题。

replication 的常用方法 - 一个 数据库用于 写入几个 副本 供读取。复制在数据库级别(不是 django)完成,即数据库配置为写入其事务日志,读取副本同步此日志并重放它。

Django multiple database 配置允许为读取和写入指定不同的数据库 URL,和/或为不同的应用程序甚至表指定不同的数据库 - 这是 database clustering 更多关注的问题,而不是复制。

【讨论】:

以上是关于Django 副本数据保存到多个数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何保存具有多个图像的 django 模型?

使用 django 动态添加输入字段并将数据保存到数据库

如何在我的生产数据库副本上运行 Django 测试?

如何使用多个 Django FBV 通过 Ajax+jQuery 捕获和保存数据

Django中将一个文本框中的数据通过点击按钮保存到数据库

django 对多个数据库支持