Django 数据分片

2023-12-28

我已经使用基于模型的路由方案成功地让我的应用程序在多个数据库上运行。 IE。模型 A 位于 DB A 上,模型 B 位于 DB B 上。我现在需要对数据进行分片。我正在查看文档,但无法确定如何执行此操作,因为相同的模型需要存在于多个数据库服务器上。我想要一个标志来表示新成员的数据库现在是数据库 X,并且成员 X-Y 位于数据库 N 上,等等。

我怎么做?是否使用 ** 提示,这对我来说似乎没有充分记录。


The hints参数旨在帮助您的数据库路由器决定应在何处读取或写入数据。它可能会随着 python 的未来版本而发展,但目前 Django 框架可能只给出一种提示,那就是instance它正在努力。

我写了这个非常简单的数据库路由器来看看 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):

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        [...some other handlers...] 
        'stderr': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler'
        }
    },
    'loggers': {
        [...some other loggers...]
        'my_project': {
            'handlers': ['stderr'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
}

然后,您可以打开 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>})
>>>

如您所见,hints当尚无可用实例(在内存中)时,该值始终为空。因此,如果您需要查询参数(例如对象的 id)来确定要查询的数据库,则不能使用路由器。如果 Django 在未来提供查询或查询集对象,也许是有可能的。hints dict.

因此,为了回答您的问题,我想说,现在您必须按照 Aaron Merriam 的建议创建一个自定义管理器。但重写只是create方法还不够,因为您还需要能够在适当的数据库中获取对象。像这样的东西可能会起作用(尚未测试):

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()

Cheers

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 数据分片 的相关文章

随机推荐

  • 如何禁用 WinForms DataGrid 中的按钮单元格?

    我有一个 WinForms 应用程序 其中包含一个 DataGridView 控件和一列 DataGridViewButtonCell 单元格 当我单击其中一个按钮时 它会启动一项后台任务 我想禁用这些按钮 直到该任务完成 我可以禁用 Da
  • Gekko 长期性能

    在下面的代码中 全年 PV 斜率优化 每小时时间步长 CSV 数据下载link https drive google com file d 172HaD87t9V PDElMER4MwDaWyuCZ3KA5 view usp sharing
  • 如何在使用rescue_from时使用Rails4和RSpec测试渲染状态:404

    我有一个带有 PagesController 的 Rails4 应用程序 当找不到页面时 show method 会抛出自定义异常 PageNotFoundError 在我定义的控制器之上rescue from PageNotFoundEr
  • 转换输出中不需要的字符编码转换

    我这里有一个情况 JAVA版本1 6 Linux RH 5 6 Tikanga Windows 7 Cygwin最新版本 等级 1 6 在一台机器 Linux 上 当我运行 Gradle 构建时 我得到生成的 xsl 文件 这些文件与我运行
  • iOS:Objective-C 中的事件监听器相当于什么?

    在我的一些学习中 我看到有人提到 在视图控制器中 您可以拥有一个模型 并在模型上有某种监听器来监听其中的变化 我认为我没有使用正确的名称 这可能就是为什么我的搜索没有找到任何结果的原因 本质上 我想将服务器调用从控制器移到我的模型中 但我需
  • 使用 Netty 的多线程 UDP 服务器

    我正在尝试使用 Netty 实现 UDP 服务器 这个想法是只绑定一次 因此只创建一个Channel This Channel仅使用一个处理程序进行初始化 该处理程序通过一个线程在多个线程之间分派传入数据报的处理ExecutorServic
  • Google Drive API 使用浏览器版本创建空的“无标题”文件

    我正在尝试使用 Google Drive API 的 浏览器 版本 它似乎主要遵循 Nodejs 语法 但除了浏览器的第一个 hello world 示例之外 似乎没有太多示例 现在我正在尝试创建一个文件夹 然后在该文件夹内创建一个简单的
  • 当任务计划程序启动时隐藏 C# 控制台应用程序窗口

    我已经在谷歌上搜索了这个并阅读了一些资源 但我无法找到一个好的答案 有谁知道如何防止控制台应用程序窗口在任务计划程序启动时打开 Ref 改变output type to Windows application会解决你的问题 转到 项目 gt
  • 从 XAML 中的 *.resx 文件获取值

    是否可以将资源文件中的某些值直接添加到 XAML 标记中 或者为了本地化 我们总是必须在 cs 文件中制作类似的内容 txtMessage Text Messages WarningUserMessage Where Messages是资源
  • Python、Pandas:使用 GroupBy.groups 描述将其应用于另一个分组

    让我们考虑一个 DataFrame 它在 2010 年 1 月的每一天包含 1 行 2 个值 date range pd date range dt 2010 1 1 dt 2010 1 31 freq 1D df pd DataFrame
  • 如何从 DQL 查询返回对象?

    我在原则 2 中编写了一个 DQL 查询 qb gt select r position gt from Entities Races r gt where qb gt expr gt eq r entrantId entrant id g
  • 如何使用 GraphicsPath 绘制形状来创建自定义控件的区域?

    我目前正在尝试覆盖OnPaint 我正在构建的自定义控件的方法 该对象只是一个简单的面板 但我试图让它看起来不同类型的方式 如下所示 我正在使用 GraphicsPath 来帮助我尝试完成此任务 但它的外观 行为并不像我预期的那样工作 因为
  • Node.js Mongoose.js 字符串到 ObjectId 函数

    是否有一个函数可以使用 mongoose 将字符串转换为节点中的 objectId 架构指定某物是一个 ObjectId 但是当它从字符串保存时 mongo 告诉我它仍然只是一个字符串 例如 对象的 id 显示为objectId blah
  • ggraph的定制图例

    我想创建一个自定义图例 示例图例如下所示 这是我的情节 我使用 ggraph 创建了这个图 在这个情节下或在情节附近的某个地方我想要有我上面提到的图例 有任何想法吗 从技术上讲 您要求使用另一个图作为图例 因此 我们需要安排一个网格并将该图
  • 为 Facebook 对象 ID 而不是 URL 制作一个点赞按钮?

    Facebook点赞按钮上的文档 http developers facebook com docs reference plugins like 允许为 URL 创建 赞 按钮 然而 文档还表明根据对象 ID 记录点赞数 http dev
  • 为什么'int i = i;'合法的? [复制]

    这个问题在这里已经有答案了 可能的重复 int 变量 1 无效主 int i i https stackoverflow com questions 3173462 int var 1 void main int i i 下面的代码在g 和
  • 可以在 ARM 模板中执行嵌套复制循环吗?

    我正在尝试动态生成路径映射 以将传入流量路由到应用程序网关的正确后端池 例如 我们有 20 个租户 每个后端池允许 5 个租户 这意味着我们将生成 4 个后端池 我需要动态创建路径映射 以便后端池一为租户 1 5 提供服务 后端池二为租户
  • MVC4 应用程序中未加载图像、CSS 和 JS

    我刚刚将一个新的 MVC4 应用程序部署到我的服务器 但某些 CSS JS 和图像未加载 例如 Chrome 控制台显示 加载资源失败 服务器响应状态为500 内部服务器错误 http beta vinformative com Conte
  • 如何在 wxPython ComboBox 中存储字符串以外的对象?

    我有一个 Vertex 对象列表 每个对象都有自己的标签和 ID 我如何使用这个列表作为 wxPython ComboBox 的模型 以便当用户选择一个选项时 我可以立即检索顶点 id 看来 ComboBox 只接受字符串作为模型 我无法创
  • Django 数据分片

    我已经使用基于模型的路由方案成功地让我的应用程序在多个数据库上运行 IE 模型 A 位于 DB A 上 模型 B 位于 DB B 上 我现在需要对数据进行分片 我正在查看文档 但无法确定如何执行此操作 因为相同的模型需要存在于多个数据库服务