Django:独立于应用程序的读取和写入的多个数据库

Posted

技术标签:

【中文标题】Django:独立于应用程序的读取和写入的多个数据库【英文标题】:Django: Multiple database for read and write independent of app 【发布时间】:2018-02-26 14:25:37 【问题描述】:

在某些特定条件下,我们如何在 Django 上使用多个数据库,例如, 1. 一个 DB 仅用于写入目的 (db_for_write.sqlite3) 2.另外两个用于阅读目的的数据库(read_replica_1.sqlite3,read_replica_2.sqlite3) 3. 所有这 3 个 DB 应始终同步(3 个 DB 应始终包含相同的数据) 4、CRUDmigration等所有动作都独立于appmodel 这是我的 Db_Router.py

import random


class ExampleDatabaseRouter(object):
    def db_for_read(self, model, **hints):
        db_list = ('db_for_read_1', 'db_for_read_2')
        return random.choice(db_list)

    def db_for_write(self, model, **hints):
        return 'db_for_write_only'

    def allow_relation(self, obj1, obj2, **hints):
        # I couldn't understand what would do this method
        return

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        # sync all DB
        return

不幸的是,我无法理解allow_relation() 方法的目的。我希望有人可以帮助我。

【问题讨论】:

您找到解决方案了吗? 【参考方案1】:

来自documentation,

allow_relation(obj1, obj2, **hints)¶

如果应该允许 obj1 和 obj2 之间的关系,则返回 True,如果应该阻止该关系,则返回 False,或者如果路由器没有意见,则返回 None。 这纯粹是一个验证操作,由外键和多对多操作使用,以确定两个对象之间是否应允许建立关系。

与文档中一样,此方法仅确定传递给它的对象是否有资格在它们之间创建关系。在使用多个数据库时,可能会出现来自不同数据库的表需要它们之间的关系的情况,但 Django 目前不支持这种关系,通常称为cross-database relationships。这是因为参照完整性。为了维护两个对象之间的关系,Django 需要知道相关对象的主键是有效的。如果主键存储在单独的数据库中,则无法轻松评估主键的有效性。

如果您需要更多地研究跨数据库关系,那么 django 文档提供了更好的explanation。

实际上,Django 文档几乎涵盖了有关路由器的所有内容。一个非常基本的示例还包括here。

【讨论】:

据我所知,就我而言,跨数据库关系是不可能的。我对吗 ? .那么我怎样才能一直同步我的三个数据库呢?你能帮我吗

以上是关于Django:独立于应用程序的读取和写入的多个数据库的主要内容,如果未能解决你的问题,请参考以下文章

Linux设备驱动程序 之 poll和select

Flume 读取RabbitMq消息队列消息,并将消息写入kafka

如何使用 Azure databricks 通过 ADLS gen 2 中的多个工作表读取和写入 excel 数据

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

django 环境的配置及Django文件简介

Django Cookie于Session