【问题标题】:Django - 1 database per model?Django - 每个模型 1 个数据库?
【发布时间】:2016-02-20 12:30:55
【问题描述】:

我找到了同样的问题,但不是真正的答案(让我们看看 DATABASE_ROUTERS ....):see here

所以我解释一下: - 我有 2 个模型 A 和 B(A 类 .... model.py 中的 B 类) - 我有 2 个数据库(db1 是 SQL 数据库,db2 是 NoSQL 数据库) - 我只有 1 个应用程序 - 模型 A 必须仅在 db1 上,模型 B 必须仅在 db2 上

我想执行“makemigrations -- db=db1”然后执行“migrate -- db=db1”,并看到迁移只为数据库 db1 准备,并且只创建模型 A,同样的事情db2 和 B

django 可以吗?

【问题讨论】:

  • Django docs 为每个型号的路由器提供示例。不就行了吗?
  • @blacklwhite 在我看来,示例路由是基于每个应用程序,而不是每个模型,因为它使用的是元 app_label。
  • @EzekielKruglick 这些示例是基于每个应用程序的,但是,您应该能够添加 model._meta.model_name 以在每个模型级别上执行此操作。

标签: python django database nosql


【解决方案1】:

Django 无法在应用程序的数据库之间拆分迁移,请参阅https://docs.djangoproject.com/en/1.9/topics/db/multi-db/#allow_migrate

您有多种选择:

  1. 让 django 将所有模型迁移到两个数据库,然后每个数据库上的一个表将留空。您将需要一个基于行的数据库路由器,并向路由器提示该对象属于哪个数据库。 读/写路由,与迁移不同,确实提供了基于模型来决定数据库的选项(而不仅仅是应用程序)。

  2. 与 1 相同,但为了安全起见,请为数据库 2 上的表 A 和数据库 1 上的表 B 运行自定义 DROP TABLE 语句。如果你会犯一些路由错误,你会得到一个异常

  3. 拆分您的应用。尽管 django 旨在将数据和功能耦合到同一个应用程序中,但您可以在需要时拆分应用程序。在您的情况下,分为三个:

    • app1 与模型 A
    • app2 与模型 B
    • app3 带有将访问 app1、app2 中的数据库层的视图、url、测试等。

Django models across multiple projects/microservices. How to?

【讨论】:

  • 只是一个问题:您如何做到“读/写路由,与迁移不同,确实提供了根据模型决定数据库的选项”?如果模型 = 'A' : db = 'db1' ?
  • 你有两个选择:(1)让django决定,你定义一个db router来告诉django如何决定。查看完整示例docs.djangoproject.com/en/1.9/topics/db/multi-db/#an-example (2) 如果调用者知道将记录发送到哪里,则对象管理器有一个 using() 参数来设置数据库,请参阅docs.djangoproject.com/en/1.9/topics/db/multi-db/…
  • 好的,我将您的第一个链接的代码替换为 if model._meta.object_name == 'A':,它工作正常 :) 非常感谢 :)
【解决方案2】:

看起来有可能。 您应该在设置DATABASES 中设置所有数据库。 之后,您可以编写自定义数据库路由器,如下所述:https://docs.djangoproject.com/en/1.9/topics/db/multi-db/#using-routers

但我相信你已经准备好阅读了。 更有趣的问题是海怪呢?看起来有一个选项可以玩 - 从这里是allow_migratehttps://docs.djangoproject.com/en/1.9/topics/db/multi-db/#an-example 我会尝试在此处放置自定义逻辑以将数据库迁移到正确的数据库中。

【讨论】:

    猜你喜欢
    • 2011-10-13
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多