原始 SQL 与 ORM 如果我已经知道 SQL

Posted

技术标签:

【中文标题】原始 SQL 与 ORM 如果我已经知道 SQL【英文标题】:raw SQL vs ORM If I already know SQL 【发布时间】:2019-11-20 05:33:25 【问题描述】:

我目前正在使用 PostgreSQL 和 nodejs。 到目前为止,我已经使用带有pg 驱动程序的原始SQL 进行了开发。 我希望我的服务在不久的将来会有相当多的记录。(10k+)

我已经对 SQL 与 ORM 进行了一些研究,因为这不是一个新问题。 据我了解,

SQL 性能更好, ORM 增强了代码的可读性,减少了代码长度,比 SQL 更容易学习。

这项研究http://www.diva-portal.org/smash/get/diva2:1014983/FULLTEXT02 表明,当行数增加时,原始 SQL 和 ORM 之间的性能差异非常大。因为研究是用Laravel ORM进行的,所以我知道nodejs ORM sequelize的结果可能不同。

我的代码很长,因为我的函数中有 SQL 字符串。如果我已经知道如何编写 SQL,是否应该切换到 ORM?

添加: 如果我要实现 ORM,因为我有一些复杂的查询连接和聚合多个表,如果我将 ORM 用于简单的 SELECTINSERT 并将原始 SQL 用于复杂的查询,这是不是一个糟糕的选择?

【问题讨论】:

What ORMs have taught me: just learn SQL 【参考方案1】:

我最近遇到了类似的事情,将与您分享我的经验。

我主要有数据库背景(SQL / 存储过程),有一点 UI 经验。去年,我使用 Postgres 和 Django 从头开始​​编写了我的第一个 Web 应用程序,然后自己开始编写整个 DB 接口,因为我只知道这些。我以前从未使用过内置 ORM,甚至不知道它是什么或它的好处。

一开始是令人兴奋和有趣的,因为您可以控制所有数据库操作,并且还可以更好地了解所有代码的工作原理。不过,过了一会儿,我意识到了一些缺点:

大多数 Django / Python 模块都设计为使用 Django 的 ORM。我很难让他们中的很多人使用我的自定义界面。一个例子是他们希望有一个“id”列作为所有相关表的 PK。另一个问题是不支持多列 PK。

如果创建新对象,需要创建多组存储过程/函数来管理它们;过了一会儿就变得乏味了

如果您的架构发生更改并且您想要升级已经有数据的安装,您必须创建自己的升级脚本

构建自己的界面的主要优点之一是您可以完全控制物理数据库模型(即您可以选择索引/键、自定义命名约定等)。

如果您没有提到对性能的关注,那么我会建议只使用提供的 ORM,因为它可以更轻松地与其他模块集成,并且更容易处理对新对象的支持。

这真的取决于这些因素对你有多重要:

开发时间 维护 性能 可定制性(即自定义 SQL) 能够与其他模块交互

如果性能和可定制性是一个大问题,并且您不打算合并第 3 方模块,那么我会考虑自己编写界面。否则,我会说只使用 ORM 会更容易。

【讨论】:

以上是关于原始 SQL 与 ORM 如果我已经知道 SQL的主要内容,如果未能解决你的问题,请参考以下文章

Django - 原始 SQL 查询或 Django QuerySet ORM

将原始 SQL 与 Doctrine 一起使用

与原始 sql 相比,Django ORM 性能较差

是否可以将 SQL 注释添加到使用 ORM 构建的查询中?

大型、可扩展和可维护的 Web 应用程序中的 ORM 或 SQL?

ORM注入和SQL注入有啥区别?