8 个用于高效编码的 JavaScript ORM 平台

为何需要对象关系映射 (ORM)?

在开发功能完善的应用程序时,几乎不可避免地需要使用数据库。 这类应用通常需要具备 CRUD 功能,即创建 (Create)、读取 (Read)、更新 (Update) 和删除 (Delete) 数据。

为了实现这一点,就需要一个数据库。 如果你正在使用面向对象的编程语言(例如 JavaScript)和一个关系数据库(比如 MySQL)来构建应用,那么与数据库交互可能会变得比较复杂。

作为 JavaScript 开发人员,你还需要处理关系数据库的复杂细节,例如数据库语法以及如何编写应用程序可能需要的复杂 SQL 查询。

请注意,关系数据库将数据存储在具有行和列的表格中,而 JavaScript 则处理对象以及对象之间的关系。 这些操作可能会耗费大量时间,并且极具挑战性,因此,我们需要对象关系映射器 (ORM)。

对象关系映射器 (ORM)

ORM 是一种工具,它允许开发人员通过面向对象的原则来使用关系数据库。

ORM 充当应用程序代码与所选关系数据库之间的桥梁,使开发人员可以使用在应用程序代码中使用的相同面向对象的原则来操作关系数据库。

ORM 将关系数据库表映射到类,类的实例代表表中的记录或行。 类属性则用于代表表中的列。

反过来说,这意味着开发人员可以使用他们选择的编程语言来创建、读取、更新、删除和管理存储在数据库中的数据,而无需编写复杂的 SQL 语句。

通过使用 ORM,可以最大程度地减少需要编写的 SQL 代码量,并且还可以避免学习新的查询语言来使用数据库。

为了理解 ORM 的工作原理,请思考以下用于查找 IT 部门用户的 MySQL 查询:

SELECT * FROM users WHERE department="IT";

可以使用 JavaScript ORM 完成相同的查询,如下所示。 请注意,这仅仅是使用纯 JavaScript 实现相同查询的一种方式:

const users = await User.findAll({
  where: {
    department: 'IT',
  },
});

使用 ORM 的优势

使用 ORM 可以为 JavaScript 开发人员带来诸多好处,其中包括:

数据库复杂性的抽象

ORM 隐藏了底层数据库的复杂性,允许开发人员通过后端语言而不是复杂的 SQL 与数据库进行交互。

一些 ORM 还提供了查询构建器,这使得使用 OOP 原则编写复杂查询变得轻而易举。 这使开发人员能够编写更简洁、更易于维护的代码,并且更易于调试和更新。

提高生产效率

ORM 抽象了编写原始 SQL 查询和管理数据库交互的复杂性,使开发人员能够专注于应用程序的业务逻辑,这才是应用程序的核心所在。

此外,开发人员能够以更熟悉的 OOP 模式与数据库进行交互,而无需编写大量样板代码或执行重复性任务。

ORM 还可用于自动为数据库提供种子数据并生成数据访问代码。 所有这些因素都极大地提高了开发人员的生产效率。

数据库无关性

ORM 的一项关键功能是它们允许你以与数据库无关的方式编写应用程序代码。 这样,你的应用程序代码就不会被绑定到某个特定数据库上,因此你可以轻松地切换应用程序正在使用的数据库,而无需更改大部分应用程序代码。

这一点至关重要,尤其是在应用程序需要发展或支持使用多个数据库的情况下。

简化的架构和关系管理

ORM 简化了在数据库中使用架构以及管理数据库实体之间关系的过程。

一些 ORM 提供了自动从现有数据库生成架构的功能,而大多数 ORM 则提供了可以轻松定义和管理存储在数据库中的表之间关系的方法。

增强的安全性

ORM 提供了增强的数据库安全性,因为它们会过滤数据,并且还在内部使用参数化查询。 参数化查询是指使用占位符作为输入值,而不是直接使用用户提供的输入的 SQL 查询。

因此,用户提供的输入永远不会直接嵌入到 SQL 查询中。 这使 ORM 能够保护你的应用程序免受 SQL 注入攻击,从而增强应用程序的安全性。

使用 ORM 的缺点

尽管 ORM 为开发人员带来了诸多好处,但它们的使用也存在一些缺点。 这一次,由于它们在数据库之上引入了一个抽象层,因此可能会导致性能开销和使用更多内存。

此外,要使用 ORM,开发人员需要学习如何使用它,并且如果没有对 SQL 的基本了解,他们就无法理解 ORM 命令的实际作用。

也就是说,对于开发人员而言,ORM 仍然是一个非常有益的工具,并且是使用 OOP 原则构建的应用程序与关系数据库交互的最佳、最简单的方法。 为了帮助你开始使用 ORM,以下列出了一些你可以在 JavaScript 应用程序中使用的最佳 ORM。

Sequelize

根据官方文档,Sequelize 是一个适用于 Oracle DB、PostgreSQL、MySQL、MariaDB、SQLite、Microsoft SQL Server、IBM DB2 和 Snowflake 数据库的现代 TypeScript 和 Node.js ORM。 Sequelize 是开源的,对于使用 Node.js 框架和关系数据库的开发人员来说,它是一个非常受欢迎的 ORM。

这可以归因于其强大的功能集,这些功能使得在 Node.js 中使用关系数据库变得轻而易举。 首先,Sequelize 是一个基于 Promise 的 ORM,这使其能够支持 Promise,而 Promise 是 Node.js 框架的核心功能。

此外,Sequelize 支持急切加载(即执行应用程序代码后立即加载资源)和延迟加载(即直到需要时才加载资源)。 Sequelize 还具有可靠的事务支持、读取复制和模型验证,并允许数据库迁移和同步。

用户在使用 Sequelize 时还可以定义架构之间的关联和关系。 最重要的是,它提供了一组丰富的查询选项,允许开发人员轻松构建复杂的数据库查询。

Prisma

Prisma 是一个开源 ORM,它允许你从任何 JavaScript 或 TypeScript 环境轻松管理数据库并与之交互。

Prisma 支持 PostgreSQL、MySQL、Microsoft SQL Server、CockroachDB、SQLite 和 MongoDB。 此外,它还允许与任何 JavaScript 或 TypeScript 框架轻松集成,从而简化了数据库操作并提高了类型安全性。

为了帮助开发人员构建查询,Prisma 提供了一项名为 Prisma 客户端的功能,该功能具有自动完成功能,并允许开发人员构建适合他们在应用程序中使用的架构的类型安全查询。

开发人员可以从头开始创建自己的架构,或者使用 Prisma 通过内省现有数据库来自动生成架构。

Prisma 的另一项功能是 Prisma Migrate,这是一个 Prisma 架构迁移工具,可以自动生成可自定义的 SQL 迁移,让用户在将应用程序从开发环境转移到生产环境时能够完全掌控且灵活自如。

最后,Prisma 用户可以访问 Prisma Studio,这是一个管理用户界面,允许用户查看、浏览、操作和了解存储在数据库中的数据。 所有这些功能使 Prisma 成为 JavaScript 和 TypeScript 开发人员的理想 ORM。

TypeORM

TypeORM 是一个开源 ORM,它的开发目标是始终支持最新的 JavaScript 功能并提供附加功能,以便开发人员创建任何类型的、使用数据库的应用程序。

TypeORM 支持 MySQL、MariaDB、PostgreSQL、CockroachDB、SQLite、Microsoft SQL Server、Oracle、SAP Hana 和 sql.js 数据库。

TypeORM 支持 JavaScript 和 TypeScript 编程语言,并且还支持 MongoDB,而 MongoDB 不是关系数据库。 TypeORM 适用于 Node.js、浏览器、Ionic、Cordova、React Native、NativeScript、Expo 和 Electron 平台。

TypeORM 允许开发人员使用多种数据库类型和多个数据库实例。 它还支持和查询缓存、日志记录、事务、关联、急切和惰性关系,并允许迁移和自动迁移生成。

TypeORM 还支持 DataMapper、ActiveRecord、流式处理原始结果、跨数据库和跨架构查询,并为用户提供了强大的查询构建器。

MikroORM

MikroORM 是一个开源 TypeScript ORM,支持 MySQL、MariaDB、PostgreSQL、SQLite 和 MongoDB。 此 ORM 基于 Datamapper、身份映射模式和工作单元。 工作单元用于维护受业务事务影响的实体列表,并且它还会协调更改的写入。

这样做的好处是允许自动处理事务、自动批处理所有查询以及直接在所使用的实体中实现业务/领域逻辑。

MikroORM 还附带了一个元数据感知的 QueryBuilder,具有自动联接支持和一个事件系统,可用于挂钩实体生命周期并更改 UnitOfWork 的工作方式。

使用 MikroORM 播种数据库(即用一组初始数据填充数据库)也更容易,因为它附带的播种器允许你生成任何大小或形状的虚假数据,并用它来播种数据库。

最后,MikroORM 还支持轻松的上下数据库迁移。

Bookshelf.js

Bookshelf 是 Node.js 的开源 JavaScript ORM。 该 ORM 旨在提供一个简单库,可用于在 JavaScript 中查询数据库以及在这些对象之间建立关系时执行常见任务。 Bookshelf 被设计为可与 PostgreSQL、MySQL 和 SQLite3 配合使用。

作为 Node.js ORM,Bookshelf 支持在使用 Node.js 应用程序时使用 Promise 和传统回调。 此外,它还支持事务、多态关联、急切/嵌套急切关系加载以及各种关系。

尽管与其他功能更丰富的 ORM 相比,Bookshelf 并不具备相同的功能级别,但 Bookshelf 的优势在于它的简单性、灵活性以及读取、理解其代码库和扩展它的容易程度。 如果你的 JavaScript 项目需要一个简单精简的 ORM,那么 Bookshelf 是一个不错的选择。

Node ORM2

Node ORM2 是一个简单且轻量级的 Node.js ORM,它支持 MySQL、SQLite 和 Progress OpenEdge 数据库。 此 ORM 允许你在 Node.js 中轻松使用你的模型。 使用模型时,它允许你轻松创建、同步、删除、获取、查找、删除、计数以及批量创建数据模型。

除了附带的内置验证之外,它还允许在模型之间创建关联并定义自定义验证。 Node ORM2 实现了实例单例行为,这确保了当你多次获取同一行时,你始终会获得代表该行的同一对象。

Waterline

Waterline 是 Node.js 的一个基于适配器的 ORM。 它也是 Sails Web 开发框架附带的默认 ORM。 然而,Waterline 仍然可以在不使用 Sails 框架的情况下使用。

作为一个基于适配器的 ORM,Waterline 通过使用适配器来支持多个数据库系统。 官方支持的数据库包括 MySQL、PostgreSQL、MongoDB、Redis 和本地存储。

不过,Waterline 还拥有针对 CouchDB、SQLite、Oracle、Microsoft SQL Server、DB2、Riak、neo4j、OrientDB、Amazon RDS、DynamoDB、Azure Table、RethinkDB 和 Solr 的社区适配器。

Waterline 允许你在项目中使用多个数据库,并且它提供了一个统一的 API 来处理不同的数据库和协议。 这意味着使用 Waterline ORM 编写的代码可以与该 ORM 支持的任何数据库一起使用,而无需更改代码。

此外,Waterline 的创建重点在于适配器之间的模块化、可测试性和一致性,这使得它非常易于使用并与各种数据库集成。

Objection.js

Objection.js 是一种 ORM,它的设计理念是在不妨碍你的情况下让你轻松使用 SQL 和底层数据库引擎的全部功能。

在这方面,它提供了 SQL 查询生成器的所有优点,并且能够有力地帮助你处理关系。 SQL 查询生成器是一种简化创建复杂 SQL 查询过程的工具。

Objection.js 提供了一种简单的方式来定义模型及其之间的关系,并且除了提供易于使用的事务之外,还具有充分利用 SQL 全部功能的完整创建、读取、更新和删除 (CRUD) 功能。

用户还可以预加载、插入和更新插入对象图,将复杂文档存储为单行,并使用 JSON 架构进行验证。 Objection.js 官方支持 TypeScript 和 JavaScript 编程语言。

结论

作为一名开发人员,当你通过 JavaScript 或 TypeScript 应用程序使用关系数据库时,你最好通过 ORM 与数据库进行交互。

这不仅可以简化数据库交互,还可以提高你的工作效率、减少需要编写的 SQL 代码量,并增强应用程序的安全性。

在尝试决定使用哪个 ORM 时,请考虑使用本文中介绍的任何 ORM,具体取决于哪些功能适合你正在构建的应用程序。

你还可以探索最好的 JavaScript 在线编译器。