在某些特定条件下,我们如何与Django上的多个数据库一起工作,例如,
1.一个DB仅用于写入目的(db_for_write.sqlite3
)
2.其他两个DB用于阅读目的(read_replica_1.sqlite3
,read_replica_2.sqlite3
)
3.所有这3 dB都应一直同步(3 dB应始终包含相同的数据)
4. CRUD
,migration
等所有动作均独立于app
或model
这是我的 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文档几乎涵盖了有关路由器的所有内容。这里也包括一个非常基本的示例。