ORM 可以代表所有可能的 SQL 查询吗?

Posted

技术标签:

【中文标题】ORM 可以代表所有可能的 SQL 查询吗?【英文标题】:Can ORMs represent every possible SQL query? 【发布时间】:2020-07-16 17:37:36 【问题描述】:

我目前正试图弄清楚 ORM 有多强大。我编写了非常简单的 Web 应用程序,您只需要简单的 CRUD 查询,并且对我使用的 ORM 非常满意。但是对于复杂的分析查询,我什至没有尝试使用 ORM。很可能是在特定情况下,这只是我的有限知识。但更笼统地说,是否有任何关于任何 ORM 的语句可以/不能代表任何可能的 SQL 查询? ORM 有多强大?

(我最熟悉Python的SQLAlchemy)

请注意:

是的,许多 ORM 支持发送原始 SQL。不过,我不考虑 ORM 的那一部分。我的问题仅针对 ORM 部分。

【问题讨论】:

【参考方案1】:

这很微妙。 ORM 的重点是将对象映射到关系结构。我使用的 ORM(主要基于 ActiveRecord 模式)在将基本 SQL 构造映射到面向对象的开发语言方面做得非常好,并允许您在应用程序中的对象实例级别进行推理,而不是行、列和连接。正如您所注意到的,这确实加速了 CRUD 开发任务。

理论上,我认为可以将每个 SQL 查询表示为一个 ORM 构造(假设 ORM 支持底层数据库引擎中的所有 SQL 构造)。

但您可能不想这样做。如果您的应用程序管理订单,那么使用 ORM 中的 CRUD 功能非常有用。但是,要在表格布局中编写按销售人员按月显示订单值的报告会涉及大量 ORM 复杂性,但可以用一个相当简单的 SQL 查询来表示。虽然 ORM 可能支持来自底层数据库引擎的每种语言结构,但它可能不会对性能做出任何承诺。

【讨论】:

以上是关于ORM 可以代表所有可能的 SQL 查询吗?的主要内容,如果未能解决你的问题,请参考以下文章

这在 Django ORM 中真的不可能吗?

我们可以使用 IN 语句在多个查询中分解 SQL 连接吗

Doctrine DBAL 可以与 ORM Query Builder 混合使用吗?

(Django)气流中的 ORM - 有可能吗?

通过 JDBC 访问分层数据 [关闭]

python orm 能否实现类似于SQL语句中的like"%"表示所有的效果?