分享到

简介

为您的 Node.js 应用程序选择 ORM 或查询构建器可能令人生畏。 有许多不同的库允许您从 JavaScript 应用程序查询和操作数据,并且每个库的设计和抽象级别各不相同。

本文旨在作为选择库的起点,并总结开发人员在为其项目选择工具之前会查找的数据。 它试图保持客观性,并尽可能少地做出价值判断。

它并不试图选择“最佳库”或以主观的方式对软件包进行排名。 相反,它总结了最流行的 Node.js 查询构建器、ORM 和数据库工具包,并描述了它们的项目健康状况。 这是通过诸如受欢迎程度、仓库活动、开发者支持和项目成熟度等标准来完成的。

注意: 本文最初于 2020 年 9 月 18 日发布。最近一次更新是在 2022 年 2 月 15 日。

标准:评估数据库库

本文将重点介绍最流行的 Node.js 查询构建器、ORM 和数据库工具包。 数据库驱动程序和较新的库将在最后简要考虑。 类型安全和 TypeScript 支持未涵盖,将在即将发布的文章中进行评估。

将根据以下标准简要总结和评估库

标准描述评估依据
受欢迎程度该库在开发者中有多受欢迎?GitHub 星星数、npm 下载量和 npm 下载量的复合月增长率
仓库活动仓库中的开发活跃度如何?提交、发布、合并的 PR 和 GitHub 问题
支持开发者是否能获得良好的支持?文档质量、StackOverflow 和 Reddit 存在、Gitter/Slack/IRC 频道和 GitHub 问题
成熟度和稳定性这个项目有多新? 它是否稳定并有支持者支持?npm 模块和 GitHub 仓库年龄、维护、财务投资、公司支持和生产用例

本文考虑的数据月份是2022 年 1 月 15 日至 2022 年 2 月 15 日。 请注意,此页面上的软件包不按特定顺序排列,这意味着该列表不代表专门的排名。

此标准并非详尽无遗,您应该选择最适合您的项目和编程偏好的工具。

SQL、查询构建器和 ORM

用于查询和操作数据的库可以大致分为三类,每类都在不同的抽象级别上运行。

从低到高依次是

  • 数据库驱动程序、客户端和连接器,如 node-postgres
  • 查询构建器,如 Knex.js,它们在数据库客户端之上运行,并允许您编写 JavaScript 代码来操作和查询数据
  • 对象关系映射工具 (ORM),如 Sequelize 和数据库工具包,如 Prisma,它们允许开发人员使用模型,即对应于数据库表的抽象实体

许多工具模糊了这些之间的界限,并允许开发人员在需要额外的灵活性或控制时降低到较低级别。 要了解更多信息,请查阅 Prisma 数据指南中的比较 SQL、查询构建器和 ORM

Prisma

评估总结

  • 受欢迎程度:受欢迎
  • 仓库活动:非常活跃
  • 支持:强大
  • 成熟度和稳定性: 较新
  • 支持的数据库:MySQL、PostgreSQL、MSSQL 和 SQLite(MongoDB、CockroachDB 和 PlanetScale 处于预览支持中)

概述

Prisma 与大多数 ORM 的不同之处在于,模型不是在类中定义的,而是在 Prisma 模式中定义的,Prisma 模式是 Prisma 工具包使用的主要配置和数据模型定义文件。 在 Prisma 模式中,您定义您的数据源,例如 PostgreSQL 数据库,以及模型,例如 usersposts 以及它们之间的关系。 使用此模式,Prisma 生成一个客户端,该客户端公开一个创建-读取-更新-删除 (CRUD) API,然后您可以使用该 API 查询您的数据库。 此 Prisma 客户端充当丰富的查询构建器,您可以在您的 Node.js 应用程序中使用它来返回纯 JavaScript 对象,而不是模型类的实例。

受欢迎程度

Prisma 在 Prisma GitHub 仓库上拥有 20.7k 颗星,是 Node 开发者中流行的数据库工具,与 Bookshelf.js 和 Objection.js 等已建立的库相当,但不如 Sequelize 和 TypeORM 等库受欢迎,后者拥有超过 25k 颗 GitHub 星星。 应该注意的是,Prisma 仅在 2020 年 6 月发布用于生产环境,而大多数其他工具已经存在了几年。

就 npm 下载量而言,在所考虑的时间段内,每周下载量为 362k,高于 Bookshelf.js 和 Objection.js 等工具,但与 Sequelize、TypeORM 和 Mongoose 不在同一级别。 然而,在本文考虑的所有主要工具中,它的增长率更高,最近 6 个月的 npm 下载量增长了 94%。

评估: 受欢迎

仓库活动

可以肯定地说,在本文考虑的所有工具中,Prisma GitHub 仓库是最活跃的。 在本文考虑的数据月份中,Prisma 进行了 258 次提交、3 次发布和 101 次合并的 PR,Prisma 正在积极开发中。 新功能、错误修复和更新频繁推送,每两周发布新版本。

评估: 非常活跃

支持

虽然 Prisma 的出现时间不如这里考虑的其他一些工具那么长,但它受益于强大而活跃的开发者支持网络。 它的文档组织良好、正在积极扩展并且非常全面。

如果您有疑问,可以使用 Prisma Slack 频道,在他们的 GitHub Discussions 页面上提问,或提交 GitHub Issue,所有这些都非常活跃。 虽然没有像 StackOverflow 那样庞大的问题库可供借鉴,但 GitHub discussions 和 Reddit 上已解答的查询库足以弥补这一点。

评估: 强大

成熟度和稳定性

Prisma 最初创建并发布于 2016 年,使其成为本文考虑的较新工具之一。 它经历了多次迭代和重新设计,最初是 Graphcool,一种 GraphQL 后端即服务。 然后 Graphcool 转变为数据库和 GraphQL 工具,成为 Prisma 1.0,一个非常受欢迎的项目,拥有 16.9k 颗 GitHub 星星。 Prisma 2.0 于 2020 年以 beta 版本发布,然后剥离了 Prisma 服务器和 GraphQL 层,成为今天的 JavaScript 和 TypeScript ORM 替代方案。

Prisma 2.0 是一个开源 JavaScript ORM,由私营公司 Prisma 维护、支持和积极开发,该公司最近完成了 1200 万美元的 A 轮融资。 Prisma 聘请全职工程师、开发者布道师、技术作家等来维护和构建 Prisma。 这意味着开发人员可以确信,在实施 Prisma 作为他们的 JavaScript 数据库接口时,他们将获得良好的支持。

评估: 较新

数据库支持

Prisma 目前支持 PostgreSQL、MySQL、MSSQL 和 SQLite。 此外,MongoDB、PlanetScale 和 CockroachDB 目前处于预览支持中。

显著特点

  • 直接使用 JavaScript 对象,而不是类和实例
  • “单一事实来源”Prisma Schema,以减少对象关系阻抗失配
  • 类型安全的数据库查询
  • 自动生成的迁移(预览)
  • 直观的关系 API
  • VSCode 插件
  • 自动完成支持

有关完整的功能列表,请查阅 Prisma 官方文档中的数据库功能

用法示例

关系查询(获取给定用户的所有帖子,给定用户的电子邮件)

const postsByUser = await prisma.user
.findOne({ where: { email: 'alice@prisma.io' } })
.posts()

总结

虽然 Prisma 是一种较新的数据库工具,并且经历了多次迭代和重新设计,但其独特的、以模式为中心的架构与使用 JavaScript 类来定义模型的典型 ORM 形成对比。 它受益于一家资金充足的公司和付费开发人员的支持,以及活跃的支持社区和快速的开发周期。 它是一个受欢迎的、快速增长的选择,并且将长期存在。

Sequelize

评估总结

  • 受欢迎程度:非常受欢迎
  • 仓库活动:非常活跃
  • 支持:一般
  • 成熟度和稳定性: 非常成熟
  • 支持的数据库:MySQL、MariaDB、SQLite 和 Microsoft SQL Server

概述

Sequelize 是一个已建立的、成熟的、基于 Promise 的 Node.js ORM,它支持 PostgreSQL、MySQL、MariaDB、SQLite 和 Microsoft SQL Server。 它遵循传统的 ORM 模式,通过扩展 Model 类来定义模型。 然后使用类方法执行 SELECTINSERT 等操作。 关系也使用类方法定义,如 hasMany()belongsTo()

受欢迎程度

在所考虑的时间段内,Sequelize 拥有 25.7k 颗 GitHub 星星和 135 万次 npm 每周下载量,是本文中考虑的最受欢迎的关系数据库 ORM。 它仍在增长,过去 6 个月的 npm 下载量增长了 14%。 相比之下,下一个最受欢迎的关系数据库 ORM 是 TypeORM,每周 npm 下载量为 918k。 (Mongoose 也非常受欢迎,但仅支持 MongoDB。)

评估: 非常受欢迎

仓库活动

在所考虑的时间段内,Sequelize 发布了 10 个新版本,推送了 179 次提交(跨所有分支),并合并了 86 个 PR。 这表明 Sequelize 非常活跃。

评估: 非常活跃

支持

Sequelize 已经存在了近十年,您很可能通过 StackOverflow 或 Reddit 搜索找到对它的支持。 它的文档内容丰富,包含大量用法示例,以及一些更理论化的用法模式讨论(例如它的关联文档)。 但是,Sequelize 的 GitHub Issues 和 Slack 频道可能需要一些关注,因为许多查询无人解答。

评估: 一般

成熟度和稳定性

Sequelize 是最成熟的 Node ORM 之一。 它不再是一个快速变化的项目,最近的开发似乎主要集中在错误修复和文档更新的维护上。 这是一个稳定的工具,完全依赖于维护者和 Sequelize 社区的开源贡献。

根据其文档,它有一些著名的用户,如 WalmartLabs 和 Bitovi。

评估: 非常成熟

数据库支持

PostgreSQL、MySQL、MariaDB、SQLite 和 Microsoft SQL Server。 它还支持使用外部软件包的 CockroachDB。

显著特点

  • 熟悉的 ORM 接口和 ActiveRecord 用法模式
  • 详细控制事务及其执行方式
  • 支持多种数据库
  • 能够使用多个读取副本
  • 预加载和延迟加载关系
  • 基于定义的模型同步数据库

有关完整的功能列表,请查阅 Sequelize 官方文档

用法示例

关系查询(特定用户的所有帖子,预加载)

const user = await User.findOne({
where: {
email: 'alice@sequelize.org',
},
include: Post,
})

总结

Sequelize 是一个已建立的、稳定的 ActiveRecord ORM,由于其受欢迎程度和多年来的大量使用,您可以期望从 StackOverflow、Reddit 和 GitHub Issues 等地方获得支持。 该项目目前的活动明显多于近年,这是一个好兆头。

TypeORM

评估总结

  • 受欢迎程度:非常受欢迎
  • 仓库活动:活跃
  • 支持:良好
  • 成熟度和稳定性: 成熟
  • 支持的数据库:MySQL、MariaDB、PostgreSQL、CockroachDB、SQLite、Microsoft SQL Server、Oracle、SAP Hana、sql.js

概述

TypeORM 是一个受 Hibernate 影响的 JavaScript 和 TypeScript ORM,可以在 Node.js、Web 浏览器和 Cordova 等多个平台上运行。 它在构建时考虑了 TypeScript 和类型支持,并支持两种主要的 ORM 架构模式:Data Mapper 和 Active Record,为开发者提供了在两者之间进行选择的灵活性。 它还包括一个查询构建器。

受欢迎程度

自 2016 年发布以来,TypeORM 发展非常迅速,已成为最流行的 JavaScript 和 TypeScript ORM 之一。 它在 GitHub 上拥有 27.2k 颗星,每周 npm 下载量为 918k,使其成为与 Sequelize 和 Mongoose 并列的最受欢迎的 ORM 选择之一。

评估: 非常受欢迎

仓库活动

TypeORM 的 GitHub 仓库很活跃。 在过去一个月中,推送了 74 次提交(到所有分支),并合并了 41 个 PR。 似乎没有严格的发布计划,最近一次发布发生在 2021 年 11 月。

评估: 活跃

支持

TypeORM 的文档写得很好,还涵盖了数据库概念,如迁移、关系和 ORM 模式,如数据映射器和活动记录。它有一个相对活跃的 Slack 社区,以及适度的 Reddit 和 StackOverflow 存在感,但是你不太可能在使用 GitHub issues 时获得太多帮助。

评估: 良好

成熟度和稳定性

虽然 TypeORM 的成熟度与 Prisma 相当,但自最初发布以来,它的设计变化较少,最初是为 TypeScript 构建的受 Hibernate 影响的 ORM(也适用于 JavaScript)。它完全依赖于开源贡献,但通过 OpenCollective 贡献获得了大约 15000 美元的年度预算的支持。值得注意的企业贡献者包括 Cockroach Labs、Aplas 和 VoterCircle Inc.

评估: 成熟

数据库支持

MySQL、MariaDB、PostgreSQL、CockroachDB、SQLite、Microsoft SQL Server、Oracle、SAP Hana、sql.js

显著特性

  • 同时支持数据映射器和活动记录 ORM 模式
  • 强大而灵活的查询构建器
  • 强大的 TypeScript 支持
  • 关系的预加载和延迟加载
  • 自动迁移生成
  • 事务支持
  • 支持多种数据库

有关完整的功能列表,请查阅 TypeORM GitHub README

使用示例

在 TypeORM 中查询特定用户的所有帖子

const userRepository = getRepository(User)
const user = await userRepository.findOne(id, {
relations: ['posts'],
})

总结

TypeORM 和 Sequelize 是两个最流行的关系数据库 ORM。TypeORM 与 Sequelize 的不同之处在于,它提供了更多的灵活性,允许您在不同的使用模式之间进行选择,并且还包括一个强大的查询构建器。TypeORM 支持许多流行的数据库,并且该项目仍然活跃,尽管完全依赖于其开源贡献者。

Mongoose

评估总结

  • 受欢迎程度:非常受欢迎
  • 仓库活动:活跃
  • 支持:良好
  • 成熟度和稳定性: 成熟
  • 支持的数据库:MongoDB

概述

Mongoose 是一个流行的且维护良好的 Node.js 对象建模工具,用于 MongoDB。严格来说,Mongoose 是一个对象文档映射器,因为 MongoDB 是一个基于文档的数据库。它允许您使用模式来建模数据,并且它包括内置的类型转换、验证、查询构建和业务逻辑钩子。

受欢迎程度

Mongoose 是最流行的用于 MongoDB 数据库的 JavaScript 数据建模工具。它在 GitHub 上有 23.9k 个星标,每周 npm 下载量为 190 万次。

评估: 非常受欢迎

仓库活动

Mongoose 的 GitHub 仓库非常活跃。在过去的一个月里,各个分支共有 199 次提交,以及 58 个合并的 PR。最近的提交主要集中在错误修复、添加功能和文档编写。发布似乎相当频繁,在考虑的时间段内发布了 5 个版本。

评估: 活跃

支持

Mongoose 的文档包括其最常见操作(如查询、创建模型和验证)的使用指南。它的 API 文档还包含许多有用的代码片段。它有一个 Slack 和 Gitter 社区(尽管两者都相对安静),您可以期望在 Reddit 和 StackOverflow 上找到大量的支持和技巧。它的 GitHub issues 部分也非常活跃,大多数 issue 都会收到维护者或其他 Mongoose 用户的某种回复或支持。

评估: 良好

成熟度和稳定性

Mongoose 自 2011 年以来就已存在,使其成为本文中考虑的最成熟的项目之一。如果您想将 Node.js ODM 与 MongoDB 一起使用,您可以相信 Mongoose 接口不会发生根本性的变化,并且它将与 MongoDB 版本保持同步更新。它拥有令人印象深刻的开源财务支持,年度预算为 6.7 万美元,全部来自 OpenCollective 贡献者。通过一系列收购,拥有 Wordpress.com、Tumblr 和 Simplenote 的公司 Automattic 继承了 Mongoose。Terra Vera、SixPlus 和 Payment Ninja 都是使用 Mongoose 构建的。

评估: 成熟

数据库支持

MongoDB

显著特性

  • NoSQL 数据库的模式和模型
  • 验证器、前置和后置中间件钩子
  • 使用 populate() 引用其他集合中的文档
  • 子文档:在其他模式中嵌套模式

有关完整的功能列表,请查阅 Mongoose 官方文档

使用示例

关系查询(获取给定用户的所有帖子,给定用户的电子邮件)

const userWithPosts = await User.findOne({
email: 'alice@mongoose.com',
}).populate('posts')

总结

如果您正在将 MongoDB 数据库与 Node 一起使用,并且想要使用 ODM,那么 Mongoose 是一个安全的选择。它是一个流行的、成熟的项目,并且仍在积极维护中。它允许您定义模式来建模数据,并提供验证、类型转换、填充、中间件、自定义方法和查询助手等功能。

Bookshelf.js

评估总结

  • 受欢迎程度:受欢迎
  • 仓库活动:不是很活跃
  • 支持:一般
  • 成熟度和稳定性: 成熟
  • 支持的数据库:PostgreSQL、MySQL 和 SQLite

概述

Bookshelf.js 是 Node.js ORM,构建在 Knex.js 查询构建器库之上。它受到数据映射器 ORM 模式的启发,并为建模和与数据交互提供了精简的接口。

受欢迎程度

Bookshelf.js 拥有 6.3k 个 GitHub 星标,不如 Sequelize 和 TypeORM 那么受欢迎,但与 Objection.js 和 Waterline.js 处于同一范围。它的每周下载量为 82k 次(相比之下,Sequelize 为 135 万次),这意味着虽然它可能没有被广泛采用,但它仍然拥有一批核心开发人员,他们更喜欢其更精简的接口。它的受欢迎程度似乎有所下降,过去 6 个月的 npm 下载量下降了 36%。

评估: 受欢迎

仓库活动

在过去的一个月里,Bookshelf 仓库中没有提交,没有发布,也没有合并的 pull 请求。大约一年内没有对主分支进行新的提交。撰写本文时,上次发布是 1.2.0,于 2020 年 6 月 7 日发布。

评估: 不是很活跃

支持

Bookshelf 的核心文档包括一个简短的快速入门指南和一些关于创建不同关系类型的代码片段。然而,它的 API 文档非常广泛,包含许多使用示例。Bookshelf 有一个 IRC 频道,但只有 7 名成员,而且似乎很安静。同样,StackOverflow 和 Reddit 上的支持也较少。您最好的选择是其 GitHub Issues 页面,尽管您可能仍然难以获得贡献者的关注。

评估: 一般

成熟度和稳定性

Bookshelf.js 自 2013 年以来就已存在,并且在这一点上已经相当成熟。其著名用户包括 Ghost、Soapee、NodeZA、Sunday Cook 和 FlyptoX。它是一个开源软件包,维护人员很少,没有财务或公司支持。

评估: 成熟

数据库支持

PostgreSQL、MySQL 和 SQLite。

显著特性

  • 具有精简 ORM 功能集的精简接口
  • 构建在 Knex.js 之上,因此可以根据需要向下切换并使用查询构建器
  • Promise 和回调接口
  • 预加载和嵌套预加载关系
  • 支持事务
  • 用于扩展功能的社区插件

有关完整的功能列表,请查阅 Bookshelf.js 官方文档

使用示例

关系查询(获取给定用户的所有帖子,给定用户的电子邮件)

const userWithPosts = await User.where(“email”, “alice@bookshelf.js”).fetch({
withRelated: [“posts”]
});

总结

Bookshelf.js 是一个精简的 ORM,为您提供标准的数据建模、查询和操作工具集。由于它构建在 Knex.js 查询构建器之上,如果您发现自己受到其接口的限制,您可以随时向下切换并编写更复杂的查询。它现在不是一个非常活跃的项目,但已经存在很长时间,并且拥有一批核心用户群,他们更喜欢其精简的风格。

Objection.js

评估总结

  • 受欢迎程度:受欢迎
  • 仓库活动:有些活跃
  • 支持:良好
  • 成熟度和稳定性: 成熟
  • 支持的数据库:SQLite、Postgres 和 MySQL

概述

Objection.js 自称为更像“关系查询构建器”而不是 ORM。与 Bookshelf.js 一样,它构建在强大的 Knex.js 查询构建器库之上,因此在灵活的查询构建器之上构建了类似 ORM 的功能,您可以随时向下切换到该构建器。

受欢迎程度

Objection.js 拥有 6.5k 个 GitHub 星标和 115k 次每周 npm 下载量,在受欢迎程度方面与 Bookshelf.js 接近,并且落后于 Prisma。它们都不如 Sequelize 和 TypeORM 那么受欢迎,Sequelize 和 TypeORM 都拥有 25k+ 星标和超过 90 万次的每周下载量。

评估: 受欢迎

仓库活动

在本文考虑的时间段内,Objection.js 仓库没有提交或合并的 PR。Objection 的上次发布是在 2021 年 12 月 31 日,其中包括一些错误修复。虽然不如 Prisma 和 TypeORM 等项目活跃,但它仍在积极维护中。

评估: 有些活跃

支持

Objection 的文档包括一个使用指南,涵盖其主要功能,如创建模型和关系、查询、事务、钩子和验证。它还包含 API 文档和一个“食谱书”,其中包含常见操作(如连接和子查询)的示例。您在 StackOverflow 上找不到太多帮助,但该项目的 Gitter 相当活跃且提供支持,它在 Reddit 上有一定的存在感,并且其维护者经常回复 GitHub issues。

评估: 良好

成熟度和稳定性

Objection 自 2015 年以来就已发布,是一个成熟的项目。它似乎没有任何形式的财务或公司支持,并且由开源社区维护。有关 Objection.js 的生产用例列表,请查阅[谁在生产环境中使用 objection.js?](谁在生产环境中使用 objection.js?)

评估: 成熟

数据库支持

SQLite、PostgreSQL 和 MySQL

显著特性

  • 构建在 Knex.js 之上
  • 预加载
  • 事务支持
  • 根据 JSON Schema 验证模型
  • 查询钩子(插入前/后、更新等)
  • 图形 Upsert
  • 分页

有关完整的功能列表,请查阅 Objection.js GitHub README

使用示例

关系查询(获取给定用户的所有帖子,给定用户的电子邮件)

const user = await User.query().findOne({
email: 'alice@objection.js',
})
const posts = await user.$relatedQuery('posts')

总结

Objection.js 与 Bookshelf.js 最相似之处在于,它在 Knex.js 查询构建器库之上构建了一组类似 ORM 的功能。根据 第 [22] 项,Objection.js 似乎维护得更积极,文档也更好,许多 Objection.js 开发人员以前曾使用过 Bookshelf.js。[谁在生产环境中使用 objection.js?](谁在生产环境中使用 objection.js?)

Waterline

评估总结

  • 受欢迎程度:有些受欢迎
  • 仓库活动:不是很活跃
  • 支持:一般
  • 成熟度和稳定性: 成熟
  • 支持的数据库:MySQL、PostgreSQL、MongoDB。通过社区适配器:Redis、MS-SQL、Oracle 以及更多。

概述

Waterline 是 Sails Node.js 框架中使用的默认 ORM。其部分设计是为了让您可以使用“一次编写,随处使用”的数据操作代码,这样您就可以编写代码来查询或操作您的数据,无论数据位于 MySQL、PostgreSQL、MongoDB 还是其他数据库中。

受欢迎程度

Waterline 是一个流行的 ORM,拥有 5.3k 个 GitHub 星标和 37k 次每周 npm 下载量。其 37k 次 npm 每周下载量使其成为所有评估工具中最不受欢迎的工具。

评估: 有些受欢迎

仓库活动

Waterline 的 GitHub 仓库最近似乎不是很活跃,在考虑的数据月份中提交和合并的 PR 均为 0。它的上次发布是在 2021 年 10 月 22 日,之前的发布发生在 2021 年 3 月。

评估: 不是很活跃

支持

如果您在使用 Waterline 时遇到任何问题,您很可能需要自行解决。它的文档包含 Sails.js 文档中的一个简短部分,尽管它的 API 文档记录得非常详尽,并包含大量使用示例。您可以在 Sails Gitter(似乎非常活跃)上找到更多支持,并使用 GitHub Issues,尽管它将在 Sails 框架 GitHub Issues 页面上。您可能需要等待一段时间才能得到问题的答案或错误修复的推送。

评估: 一般

成熟度和稳定性

Waterline 自 2013 年左右开始出现,并且是一个成熟的软件包,具有稳定的 API。作为 Sails.js JavaScript 框架的一部分,它由 Sails 公司管理和维护,Sails 公司是一家在 Y Combinator 创业孵化器中孵化的私有种子轮融资公司。Sails.js 是一个流行的 JavaScript 框架,被 Verizon、Postman、JetBlue 等公司使用,但尚不清楚有多少生产用例依赖于独立的 Waterline 库。

评估: 成熟

数据库支持

MySQL、PostgreSQL、MongoDB。通过社区适配器:Redis、MS-SQL、Oracle 以及更多。

主要功能

  • 编写数据库无关代码
  • 填充模型之间的关系,即使不同模型的数据位于不同的数据库中

有关完整的功能列表,请参阅 Waterline ORM GitHub README

用法示例

关系查询(获取给定用户的所有帖子,给定用户的电子邮件)

const userWithPosts = await User.find({ email: 'alice@waterline.js' }).populate(
'posts'
)

总结

Waterline 是内置于 Sails.js JavaScript 框架中的 ORM/ODM,因此其主要目标是支持多种数据库类型(关系型和 NoSQL),而无需重写代码。最近几个月,该项目停滞不前,并且支持不如本文中考虑的其他一些库那么强大。

Knex.js(查询构建器)

评估总结

  • 受欢迎程度:非常受欢迎
  • 仓库活动:活跃
  • 支持:良好
  • 成熟度和稳定性: 成熟
  • 支持的数据库:PostgreSQL、Amazon Redshift、MySQL、MariaDB、SQLite、MSSQL

概述

Knex.js 是一个 Node.js 查询构建器(不是 ORM),它支持多种数据库,并包含事务支持、连接池和流式接口等功能。它允许你在数据库驱动程序之上工作,并避免手动编写 SQL。然而,由于它是一个较低级别的库,因此需要熟悉 SQL 和关系数据库概念,如连接和索引。

受欢迎程度

Knex.js 拥有 15.4k 个 GitHub 星星和每周 104 万次 npm 下载量,是一个非常流行的 JavaScript 查询构建器。

评估: 非常受欢迎

仓库活跃度

在所考虑的数据月份中,Knex.js 在所有分支中推送了 42 次提交,合并了 26 个 PR,并发布了 3 个版本。最近的提交包括错误修复和功能。

评估: 活跃

支持

Knex.js 的文档主要由其 API 的完整文档组成,这些文档内容广泛但可能相当简洁。需要熟悉关系数据库、SQL 及其核心功能集(连接、连接等)。它托管了一个不太活跃的 Gitter 频道,但你也许可以在 StackOverflow 和 Reddit 上找到一些支持。它的 GitHub Issues 页面似乎非常活跃,因此你可以确信你的查询将得到项目维护者的关注。

评估: 良好

成熟度和稳定性

Knex 自 2013 年以来一直存在,并且是一个成熟的项目。它被设计为一个“包含所有功能”的 JavaScript 查询构建器,支持多种数据库驱动程序,从那时起,它的接口没有太大变化。它是一个完全由社区维护的开源项目,虽然它不像本文中考虑的其他一些库那样活跃,但次要版本发布频繁,并且少数贡献者继续向库推送修复和改进。

评估: 成熟

数据库支持

PostgreSQL、Amazon Redshift、MySQL、MariaDB、SQLite、MSSQL

主要功能

  • 回调和 Promise 接口
  • 流式接口
  • 查询和模式构建器
  • 事务支持
  • 连接池
  • 标准化不同查询客户端和方言之间的响应

有关完整的功能列表,请参阅 knex.js GitHub README

用法示例

JOIN 查询(获取给定用户的所有帖子,给定用户的电子邮件)

const posts = await knex('posts')
.join('users', {
'users.id': 'posts.user_id',
'users.email': 'alice@knex.js',
})
.select('*')

总结

Knex.js 与本文中考虑的大多数数据库工具不同,因为它不是 ORM 或位于数据库之上的抽象层,用于对数据进行建模。它是一个强大而灵活的查询构建器,充当数据库驱动程序的包装器,允许你简化某些查询并删除样板 SQL。它是最流行的“纯” JavaScript 查询构建器,并且是一个积极维护的成熟项目。

其他值得注意的库

本文重点介绍了一些最流行的 Node.js ORM、数据库工具和查询构建器,但你可能希望为你的项目考虑其他几种工具

MassiveJS

MassiveJS 是一个用于 PostgreSQL 的 Node.js 数据库工具,它构建用于处理数据库的抽象,但不是具有模型和实体的成熟 ORM。与 Prisma 类似,它可以连接到你的数据库并内省其模式,以构建用于数据库中编码的数据模型的 API。它包括动态查询构建器和事务支持,并且专为 PostgreSQL 设计,因此支持其独特的功能集,如数组字段和操作、正则表达式匹配、外表和物化视图。

Mikro-ORM

Mikro-ORM 是一个较新的 TypeScript ORM,它也支持原生 JavaScript。由于它主要是一个 TypeScript ORM,因此本文未对其进行全面评估。Mikro-ORM 是一个快速增长的项目,在 GitHub 上非常活跃,并得到其开发人员的强烈支持。受 Doctrine(一个 PHP ORM)的影响,它是一个受 Data Mapper、Identity Map 和 Unit of Work 影响的 ORM。它的一些功能包括自动事务处理、对多个数据库的支持、内置的基于 Knex.js 的查询构建器以及模式和实体生成器。

Slonik

Slonik 位于 node-postgres 数据库驱动程序之上的一个级别。它是一个实用程序集合,内置了类型安全、查询模拟、连接和事务处理、详细日志记录、值插值和许多其他功能。你仍然需要编写原始 SQL,但它旨在在使用 PostgreSQL 数据库时增加安全性和效率。该库于 2017 年发布,至今仍然非常活跃,并在 GitHub 上得到支持。

数据库驱动程序

在抽象频谱的最低级别是数据库驱动程序,可以使用它们使用其查询语言直接与数据库交互。总结每个 Node.js 数据库客户端超出了本文的范围,但为了方便起见,这里列出了主要的数据库驱动程序

总结

类型受欢迎程度活跃度支持成熟度和稳定性官方支持的数据库
PrismaORM + 查询构建器💜💜🌳🌳🌳🌳🔵🔵🔵🔵较新,由 Prisma 公司支持PostgreSQL、MySQL、MariaDB、SQLite、MSSQL(MongoDB、CockroachDB 和 PlanetScale 预览版)
SequelizeORM💜💜💜🌳🌳🔵🔵成熟,无资金PostgreSQL、MySQL、MariaDB、SQLite、MSSQL
TypeORMORM + 查询构建器💜💜💜🌳🌳🌳🔵🔵🔵成熟,OpenCollective 资助($1.5 万美元)PostgreSQL、MySQL、MariaDB SQLite、MSSQL、CockroachDB、Oracle、Sap Hana
MongooseODM + 查询构建器💜💜💜🌳🌳🌳🔵🔵🔵成熟,OpenCollective 资助($6.7 万美元),由 Automattic 支持MongoDB
Bookshelf.jsORM + 查询构建器 (knex.js)💜💜🌳🔵🔵成熟,无资金PostgreSQL、MySQL、SQLite
Objection.jsORM + 查询构建器 (knex.js)💜💜🌳🌳🔵🔵🔵成熟,无资金PostgreSQL、MySQL、SQLite
WaterlineORM💜🌳🔵🔵成熟,由 Sails 公司支持PostgreSQL、MySQL、MongoDB
Knex.js查询构建器💜💜💜🌳🌳🌳🔵🔵🔵成熟,无资金PostgreSQL、MySQL、MariaDB、SQlite、MSSQL、Oracle、Amazon Redshift

结论

本文总结了最流行的 Node.js ORM、数据库工具包和查询构建器。根据仓库贡献和开发者支持等标准评估了它们作为开源项目的健康状况。

它并非旨在作为选择 Node.js 数据库接口的详尽框架,并且其他因素(如软件包的编程接口、设计、对数据库功能的支持和灵活性)可能比此处评估的大部分标准重要得多。不同的 Node.js 项目可能需要不同的工具。

要了解有关查询构建器和 ORM 的更多信息,请参阅 比较 SQL、查询构建器和 ORM,来自 Prisma 的数据指南,这是一个免费的实用知识库,用于学习数据库、数据建模等等。