在我的数据库中,我有一个Customer
我的数据库中定义的表,所有其他表都是外键的。
class Customer(models.Model):
...
class TableA(models.Model):
Customer = models.ForeignKey(Customer)
...
class TableB(models.Model):
Customer = models.ForeignKey(Customer)
...
我正在尝试实现一个数据库路由器,它根据主键确定要连接的数据库Customer
桌子。例如,id
1 - 100 范围内的 s 将连接到数据库 A,id
101 - 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(使用前将#替换为@)