Django数据分片
我已经使用基于模型的路由方案成功地使我的应用程序在多个数据库上运行。也就是说,模型A位于DB A上,模型B位于DB B上。我现在需要共享数据。我正在查看这些文档,但在解决如何做到这一点时遇到了困难,因为同一个模型需要存在于多个数据库服务器上。我想有一个标志,表示新成员的DB现在是数据库X,成员X-Y在数据库N上,等等 我该怎么做?是否使用**提示,我认为这方面的文档记录不充分。应该允许您指定要使用的数据库 子类化create方法可能会完成您希望完成的任务Django数据分片,django,Django,我已经使用基于模型的路由方案成功地使我的应用程序在多个数据库上运行。也就是说,模型A位于DB A上,模型B位于DB B上。我现在需要共享数据。我正在查看这些文档,但在解决如何做到这一点时遇到了困难,因为同一个模型需要存在于多个数据库服务器上。我想有一个标志,表示新成员的DB现在是数据库X,成员X-Y在数据库N上,等等 我该怎么做?是否使用**提示,我认为这方面的文档记录不充分。应该允许您指定要使用的数据库 子类化create方法可能会完成您希望完成的任务 class CustomManager(
class CustomManager(models.Manager)
def get_query_set(self):
return super(CustomManager, self).get_query_set()
def create(self, *args, **kwargs):
return super(CustomManager, self).using('OTHER_DB').create(*args, **kwargs)
class ModelA(models.Model):
objects = CustomManager()
我还没有对此进行测试,所以我不知道您是否可以在“使用”的末尾添加一个“创建”该
提示
参数旨在帮助您的数据库路由器决定在何处读取或写入其数据。它可能会随着python的未来版本而发展,但目前Django框架可能只给出了一种提示,那就是它正在处理的实例
我编写了这个非常简单的数据库路由器,以了解Django的功能:
# routers.py
import logging
logger = logging.getLogger("my_project")
class DebugRouter(object):
"""A debugging router"""
def db_for_read(self, model, **hints):
logger.debug("db_for_read %s" % repr((model, hints)))
return None
def db_for_write(self, model, **hints):
logger.debug("db_for_write %s" % repr((model, hints)))
return None
def allow_relation(self, obj1, obj2, **hints):
logger.debug("allow_relation %s" % repr((obj1, obj2, hints)))
return None
def allow_syncdb(self, db, model):
logger.debug("allow_syncdb %s" % repr((db, model)))
return None
您可以在settings.py
中声明:
DATABASE_ROUTERS = ["my_project.routers.DebugRouter"]
确保日志记录正确配置为输出调试输出(例如到stderr):
然后,您可以打开Django shell并测试一些请求,以查看您的路由器收到了哪些数据:
$ ./manage.py shell
[...]
>>> from my_project.my_app.models import User
>>> User.objects.get(pk = 1234)
db_for_read (<class 'my_project.my_app.models.User'>, {})
<User: User object>
>>> user = User.objects.create(name = "Arthur", title = "King")
db_for_write (<class 'my_project.my_app.models.User'>, {})
>>> user.name = "Kong"
>>> user.save()
db_for_write (<class 'my_project.my_app.models.User'>, {'instance':
<User: User object>})
>>>
干杯有趣的链接:嗨,我不太确定你想做什么。你能给出具体的代码示例吗?
$ ./manage.py shell
[...]
>>> from my_project.my_app.models import User
>>> User.objects.get(pk = 1234)
db_for_read (<class 'my_project.my_app.models.User'>, {})
<User: User object>
>>> user = User.objects.create(name = "Arthur", title = "King")
db_for_write (<class 'my_project.my_app.models.User'>, {})
>>> user.name = "Kong"
>>> user.save()
db_for_write (<class 'my_project.my_app.models.User'>, {'instance':
<User: User object>})
>>>
class CustomManager(models.Manager)
def self.find_database_alias(self, pk):
return #... implement the logic to determine the shard from the pk
def self.new_object_database_alias(self):
return #... database alias for a new object
def get(self, *args, **kargs):
pk = kargs.get("pk")
if pk is None:
raise Exception("Sharded table: you must provide the primary key")
db_alias = self.find_database_alias(pk)
qs = self.get_query_set().using(db_alias)
return qs.get(*args, **kargs)
def create(self, *args, **kwargs):
db_alias = self.new_object_database_alias()
qs = super(CustomManager, self).using(db_alias)
return qs.create(*args, **kwargs)
class ModelA(models.Model):
objects = CustomManager()