Django 中的动态数据库路由

2024-01-24

在我的数据库中,我有一个Customer我的数据库中定义的表,所有其他表都是外键的。

class Customer(models.Model):
    ...

class TableA(models.Model):
    Customer = models.ForeignKey(Customer)
    ...

class TableB(models.Model):
    Customer = models.ForeignKey(Customer)
    ...

我正在尝试实现一个数据库路由器,它根据主键确定要连接的数据库Customer桌子。例如,id1 - 100 范围内的 s 将连接到数据库 A,id101 - 200 范围内的 s 将连接到数据库 B。

我已经阅读了 Django 文档routers https://docs.djangoproject.com/en/dev/topics/db/multi-db/#using-routers但我不确定我所要求的是否可能。具体来说,方法db_for_read(model, **hints) and db_for_write(model, **hints)致力于type的对象。这对我来说毫无用处,因为我需要基于对象实例的内容进行路由。该文件进一步指出,唯一的**hints此时提供的是instance适用时对象,在某些情况下不对象instance完全提供。这并没有激发我的信心,因为它没有明确说明没有的情况instance提供。

我本质上是在尝试实现数据库的应用程序级分片。这在 Django 中可能吗?


解决先有鸡还是先有蛋的问题

在拯救新客户时,您必须解决先有鸡还是先有蛋的问题。你必须保存才能得到一个id,但你必须知道id才能知道保存到哪里。

您可以通过首先将所有客户保存在数据库中,然后检查 id 并将其也保存在目标数据库中来解决这个问题。看Django multidb:写入多个数据库 https://stackoverflow.com/q/4041473/383793。如果你这样做,你就不会遇到这些问题 https://docs.djangoproject.com/en/dev/topics/db/multi-db/#moving-an-object-from-one-database-to-another。但一定要注意deleting https://docs.djangoproject.com/en/dev/topics/db/multi-db/#selecting-a-database-to-delete-from顾客。

然后使用 **hints 进行路由

剩下的路由问题非常简单,如果instance就在提示里。要么它is客户,您将返回“DatabaseA”或它has客户,您将决定其 customer_id 或 customer.id。

试着记住,没有勺子。

当提示中没有实例,但它是应用程序中的模型时,请引发错误,以便您可以更改创建查询集的代码。当提示没有自动添加时,您应该始终提供提示。

什么才能真正烘烤你的饼干

如果对于大多数查询,您有认识的客户,这是可以的。但想想像这样的查询TableA.objects.filter(customer__name__startswith='foo')

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

Django 中的动态数据库路由 的相关文章

随机推荐