我现在正在研究 Django 分片模式。
我查看了 Django 路由器,但决定自己动手。
对您的问题的一些想法:
- 一种想法是使用一个数据库,然后在保存后使用 Django 信号复制适当的数据。
类似的东西——
import settings.databases as dbs_list
def post_save_function(UserModel):
for db in dbs_list:
UserModel.save(using=db,force_insert=True)
保存用户对象(至少在单数据库模型上)似乎通过 django.contrib 中发生的各种魔法在后台保存会话、身份验证等数据,因此您可能不必进入并找出所有这些数据库表的名称和类型。
为了支持这种工作的可能性,我发誓我最近在某个地方(可能在 Alex Gaynor 的一篇博客文章中)读到,如果一个对象有一个外键,Django 将尝试使用该对象所在的同一个数据库(对于根据 Django 通常的操作方式,有明显的原因)。
- 另一个想法:
从您引用的 Django multiDB 页面上的示例中,我想知道以下内容是否可行:
他们的示例代码:
def allow_syncdb(self, db, model):
"Explicitly put all models on all databases."
return True
可能的修改:
def allow_syncdb(self, db, model):
if isinstance(model,User):
return True
elif isinstance(model,Session):
return True
else:
''' something appropriate --
whatever your sharding schema is for other objects '''
再看一遍,这段代码作为“db_for_write”函数可能会更有用。但你明白了。
毫无疑问,您必须添加其他类型的模型才能完成这项工作(所有 auth 的东西,这是广泛的)。
祝你好运!希望这对您有所帮助。
我对你的发现和 cmets 很感兴趣!
jb