Django的ORM有哪些局限性?

Kar*_*Kar 20 python django orm

我听说开发人员不想使用ORM,但不知道为什么.ORM的缺点是什么?

Gar*_*ers 9

首先我要说的是,我完全主张在大多数简单案例中使用ORM.使用非常简单(关系)的数据模型时,它提供了很多便利.

但是,既然你问了缺点......

从概念的角度来看,ORM永远不能成为底层数据模型的有效表示.它最多只能是您数据的近似值 - 大多数情况下,这就足够了.

问题是ORM将在"一个类 - >一个表"的基础上映射,这并不总是有效.

如果你有一个非常复杂的数据模型 - 理想情况下,它不能由单个数据库表正确表示 - 那么你可能会发现你花了很多时间来对抗ORM,而不是让它适合你.

在实践层面上,你会发现总有一种解决方法; 一些开发人员将支持/反对ORM,但我赞成采用混合方法.Django适用于此,因为您可以根据需要轻松地放入原始SQL.就像是:

Model.objects.raw("SELECT ...")
Run Code Online (Sandbox Code Playgroud)

当您针对数据执行简单的CRUD操作时,ORM会从99.99%的其他情况中完成大量工作.

根据我的经验,完全避免ORM的两个最佳理由是:

  • 当您拥有经常通过多个连接和聚合检索的复杂数据时.通常,手动编写SQL将更加清晰.
  • 性能.ORM非常擅长构建优化查询,但没有什么可以与编写一个好的,高效的SQL竞争.

但是,当所有的说法和完成后,在与Django广泛合作之后,我可以一方面指望ORM不允许我按照自己的意愿行事的次数.


Kra*_*mar 8

SQLAlchemy对这个问题的回应的创建者是django,现在被认为是pythonic..这显示了对系统的许多差异和深刻理解.

sqlalchemy_vs_django_db讨论reddit

注意:两个链接都很长,需要时间阅读.我不是在写那些可能导致误解的要点.


e-s*_*tis 5

Django粉丝的另一个答案,但是:

  • 如果对父类使用继承和查询,则无法获取子项(尽管可以使用SQLAlchemy).
  • Group By并且Having使用aggregate/ 很难翻译条款annotate.
  • ORM制作的一些查询只是非常漫长,有时甚至是你喜欢的东西 model.id IN [1, 2, 3... ludicrous long list]
  • 有一种方法要求使用"东西在场"使用的原始__contains,但不是"字段在东西".由于在DBMS中没有可移植的方法来执行此操作,因此为其编写原始SQL非常烦人.如果您的应用程序开始变得复杂,那么会出现很多像这样的小边缘情况,因为正如@Gary Chambers所说,DBMS中的数据并不总是与OO模型匹配.
  • 它是一种抽象,有时,抽象泄漏.

但更常见的是,我遇到的那些不想使用ORM的人出于错误的原因这样做:智力懒惰.有些人不会努力做出公平的尝试,因为他们知道某些事情,并希望坚持下去.你可以在计算机科学中发现其中有多少是可怕的,其中很大一部分工作就是要跟上新的东西.

当然,在某些领域它才有意义.但通常有理由不使用它的人会在其他情况下使用它.我从来没有见过任何严肃的计算机科学家说这一切,只是在某些情况下不使用它的人,并且能够解释原因.

公平地说,很多程序员都不是计算机科学家,有生物学家,数学家,老师或鲍勃,隔壁的人只是想帮助.从他们的角度来看,当你可以用你的工具箱做你想做的事情时,不花几个小时学习新东西是完全合乎逻辑的.