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



在某些特定条件下,我们如何与Django上的多个数据库一起工作,例如,


1.一个DB仅用于写入目的(db_for_write.sqlite3
2.其他两个DB用于阅读目的(read_replica_1.sqlite3read_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()方法的目的。我希望有人可以帮助我。

来自文档,

allow_relation(obj1,obj2,**提示)¶

返回 true 如果应允许OBJ1和OBJ2之间的关系,则应false如果应防止关系,或者如果路由器没有意见,则无关。这纯粹是验证操作,由外键使用,许多操作用于许多操作,以确定是否应在两个对象之间允许关系。

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

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

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

最新更新