Django4 中文入门教程 Django4.0 多数据库-多数据库的局限性

2024-02-25 开发教程 Django4 中文入门教程 匿名 5

跨数据库关系

Django 当前不提供对跨多数据库的外键或多对多关系任何支持。如果已经使用路由来分隔模型到不同数据库,那么通过这些模型来定义的任何外键和多对多关系必须在单一数据库内。

这是因为参照完整性。为了维护两个对象之间的关系,Djagno 需要知道这个相关对象的外键是否是合法的。如果外键被保存在单独的数据库上,则无法轻松评价外键的合法性。

如果你正在使用 Postgres,Oracle,或支持 InnoDB 的 MySQL,这是在数据库完整性级别上强制执行的——数据库级别的键约束防止创建无法验证的关系。

然而,如果你正在使用 SQLite 或支持 MyISAM 表的MySQL,这就不会强制参照完整性;因此,你可以伪造跨数据库的外键。尽管 Django 并没有正式支持这个设置。

contrib应用程序的行为

一些贡献应用包括模型,一些应用依赖于其他应用。 由于跨数据库关系是不可能的,因此这会对如何跨数据库拆分这些模型产生一些限制:

  • 在给定合适的路由器的情况下,​contenttypes.ContentType​,​sessions.Session​和​sites.Site​中的每一个都可以存储在任何数据库中。
  • auth​模型 - ​User​,​Group​和​Permission ​- 链接在一起并链接到​ContentType​,因此它们必须与​ContentType​存储在同一个数据库中。
  • admin​依赖于​auth​,所以它的模型必须和​auth​在同一个数据库中。
  • flatpages​和​redirects​依赖于​sites​,所以他们的模型必须和​sites​在同一个数据库中。

注意:如果要将内容类型同步到多个数据库,请注意它们的主键可能在数据库之间不匹配。这可能导致数据损坏或数据丢失。