数据库工具
2022 年 11 款顶级 Node.js ORM、查询构建器和数据库库
简介
为你的 Node.js 应用选择 ORM 或查询构建器可能令人望而生畏。有许多不同的库可以让你从 JavaScript 应用程序中查询和操作数据,而且每个库在设计和抽象级别上都各不相同。
本文旨在为选择库提供一个起点,并总结开发者在为其项目选择工具之前会查阅的数据。它力求保持客观,并尽可能少地进行价值判断。
本文不试图选择“最佳库”或主观地对软件包进行排名。相反,它总结了最流行的 Node.js 查询构建器、ORM 和数据库工具包,并描述了它们的项目健康状况。这是通过使用受欢迎程度、仓库活跃度、开发者支持和项目成熟度等标准来完成的。
注意:本文最初发布于 2020 年 9 月 18 日。最近一次更新是在 2022 年 2 月 15 日。
评估标准:评估数据库库
本文将重点介绍最流行的 Node.js 查询构建器、ORM 和数据库工具包。数据库驱动程序和较新的库将在文末简要提及。类型安全和 TypeScript 支持不在此文中介绍,将在后续文章中进行评估。
各库将根据以下标准进行简要总结和评估
标准 | 描述 | 评估依据 |
---|---|---|
受欢迎程度 | 该库在开发者中有多受欢迎? | GitHub 星标数、npm 下载量和 npm 下载量的月复合增长率 |
仓库活跃度 | 仓库的开发活跃度如何? | 提交、发布、合并的 PR 和 GitHub Issue |
支持 | 开发者能否获得良好支持? | 文档质量、StackOverflow 和 Reddit 上的存在、Gitter/Slack/IRC 频道和 GitHub Issue |
成熟度与稳定性 | 这个项目有多新?它稳定吗,有支持者支持吗? | 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 schema 中定义的,Prisma schema 是 Prisma 工具包使用的主要配置和数据模型定义文件。在 Prisma schema 中,你定义数据源(如 PostgreSQL 数据库)和模型(如 users
和 posts
)以及它们之间的关系。使用此 schema,Prisma 会生成一个暴露创建-读取-更新-删除 (CRUD) API 的客户端,你可以使用它来查询数据库。这个 Prisma 客户端作为一个功能丰富的查询构建器,你可以在 Node.js 应用中使用它来返回普通的 JavaScript 对象,而不是模型类的实例。
受欢迎程度
Prisma 在 Prisma GitHub 仓库上拥有 2.07 万星标,是 Node 开发者中流行的数据库工具,与 Bookshelf.js 和 Objection.js 等成熟库相当,但不如 Sequelize 和 TypeORM 等库流行,它们拥有超过 2.5 万的 GitHub 星标。值得注意的是,Prisma 于 2020 年 6 月才发布生产版本,而大多数其他工具已经存在多年。
在 npm 下载量方面,在本文考虑的时间段内,Prisma 每周下载量为 36.2 万次,高于 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,这是一个非常受欢迎的项目,拥有 1.69 万的 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 是一个较新的数据库工具,并且经历了多次迭代和重新设计,但其独特的、以 schema 为中心的架构与使用 JavaScript 类定义模型的典型 ORM 形成对比。它受益于一家获得融资的公司和受薪开发人员的支持,以及活跃的支持社区和快速的开发周期。它是一个流行、快速增长的选择,并且将继续存在下去。
如果你想了解更多关于我们认为 Prisma 是一个出色选择的原因,请查看我们的《为什么选择 Prisma?》页面。
Sequelize
评估总结
- 受欢迎程度:非常流行
- 仓库活跃度:非常活跃
- 支持:一般
- 成熟度与稳定性:非常成熟
- 支持的数据库:MySQL、MariaDB、SQLite 和 Microsoft SQL Server
概述
Sequelize 是一个成熟、稳定的、基于 Promise 的 Node.js ORM,支持 PostgreSQL、MySQL、MariaDB、SQLite 和 Microsoft SQL Server。它遵循传统的 ORM 模式,通过扩展 Model
类来定义模型。然后使用类方法执行 SELECT
和 INSERT
等操作。关系也使用 hasMany()
和 belongsTo()
等类方法定义。
受欢迎程度
在本文考虑的时间段内,Sequelize 拥有 2.57 万 GitHub 星标和 135 万 npm 每周下载量,是本文中考虑的最受欢迎的关系型数据库 ORM。它仍在增长,过去 6 个月的 npm 下载量增长了 14%。相比之下,下一个最受欢迎的关系型数据库 ORM 是 TypeORM,每周 npm 下载量为 91.8 万次。(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 等平台找到支持。该项目目前的活跃度明显高于过去几年,这是一个好兆头。
要更集中地比较 Prisma 和 Sequelize,你可以查看我们的Sequelize 比较页面。
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 上拥有 2.72 万星标,每周 npm 下载量达到 91.8 万次,使其成为与 Sequelize 和 Mongoose 并列的最受欢迎的 ORM 选择之一。
评估:非常流行
仓库活跃度
TypeORM 的 GitHub 仓库很活跃。在过去的一个月里,有 74 次提交(到所有分支)被推送,41 个 PR 被合并。似乎没有严格的发布时间表,最近一次发布是在 2021 年 11 月。
评估:活跃
支持
TypeORM 的文档很好,还涵盖了数据库概念,如迁移、关系,以及数据映射器和活动记录等 ORM 模式。它有一个活跃度一般的 Slack 社区,以及适中的 Reddit 和 StackOverflow 存在,但你不太可能通过 GitHub issues 获得太多帮助。
评估:良好
成熟度与稳定性
尽管 TypeORM 在成熟度上可与 Prisma 相媲美,但自其最初作为受 Hibernate 影响、为 TypeScript 构建(也适用于 JavaScript)的 ORM 发布以来,其设计变化较小。它完全依赖于开源贡献,但通过 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 支持许多流行的数据库,并且该项目仍然活跃,尽管完全依赖于其开源贡献者。
要更集中地比较 Prisma 和 TypeORM,你可以查看我们的TypeORM 比较页面。
Mongoose
评估总结
- 受欢迎程度:非常流行
- 仓库活跃度:活跃
- 支持:良好
- 成熟度与稳定性:成熟
- 支持的数据库:MongoDB
概述
Mongoose 是一个流行且维护良好的 MongoDB Node.js 对象建模工具。严格来说,Mongoose 是一个对象文档映射器,因为 MongoDB 是一个基于文档的数据库。它允许你使用 schema 对数据进行建模,并包含内置的类型转换、验证、查询构建和业务逻辑钩子。
受欢迎程度
Mongoose 是最受欢迎的 MongoDB 数据库 JavaScript 数据建模工具。它在 GitHub 上拥有 2.39 万星标,每周 npm 下载量达到 190 万次。
评估:非常流行
仓库活跃度
Mongoose 的 GitHub 仓库非常活跃。在过去的一个月里,各分支共有 199 次提交,并合并了 58 个 PR。最近的提交主要集中在错误修复、添加功能和文档方面。在所考虑的时间段内,发布版本似乎也相当频繁,共有 5 个。
评估:活跃
支持
Mongoose 的文档包括其最常见操作(如查询、创建模型和验证)的使用指南。其 API 文档也包含许多有用的代码片段。它有一个 Slack 和 Gitter 社区(尽管两者都相对安静),你可以在 Reddit 和 StackOverflow 上找到大量的支持和提示。其 GitHub 问题区也相当活跃,大多数问题都得到了维护者或其他 Mongoose 用户的某种回应或支持。
评估:良好
成熟度和稳定性
Mongoose 自 2011 年以来一直存在,是本文所考虑的最成熟的项目之一。如果你想在 MongoDB 中使用 Node.js ODM,你可以相信 Mongoose 接口不会发生根本性改变,并且它将与 MongoDB 的发布版本保持同步更新。它拥有令人印象深刻的开源资金支持,每年 6.7 万美元的预算完全来自 OpenCollective 的贡献者。通过一系列收购,拥有 Wordpress.com、Tumblr 和 Simplenote 的 Automattic 公司继承了 Mongoose。Terra Vera、SixPlus 和 Payment Ninja 都是使用 Mongoose 构建的。
评估:成熟
数据库支持
MongoDB
显著特点
- 适用于 NoSQL 数据库的 Schema 和 Model
- 验证器、前置和后置中间件钩子
- 使用
populate()
引用其他集合中的文档 - 子文档:在其他 schema 中嵌套 schema
有关完整功能列表,请查阅 Mongoose 官方文档。
使用示例
关系查询(通过给定用户的电子邮件,获取该用户的所有帖子)
const userWithPosts = await User.findOne({email: 'alice@mongoose.com',}).populate('posts')
总结
如果你正在使用 MongoDB 数据库和 Node.js,并且想使用 ODM,那么 Mongoose 是一个稳妥的选择。它是一个流行且成熟的项目,并持续得到积极维护。它允许你定义 schema 来建模数据,并提供验证、类型转换、填充(population)、中间件、自定义方法和查询辅助等功能。
如需更深入地比较 Prisma 和 Mongoose,你可以查看我们的 Mongoose 比较页面。
Bookshelf.js
评估总结
- 受欢迎程度:流行
- 仓库活跃度:不甚活跃
- 支持:一般
- 成熟度与稳定性:成熟
- 支持的数据库:PostgreSQL、MySQL 和 SQLite
概述
Bookshelf.js 是一个基于 Knex.js 查询构建器库构建的 Node.js ORM。它受到 Data Mapper ORM 模式的启发,并提供了一个精简的接口,用于建模和与数据交互。
流行度
Bookshelf.js 拥有 6.3k GitHub 星,不如 Sequelize 和 TypeORM 流行,但与 Objection.js 和 Waterline.js 处于同一水平。它每周有 8.2 万次下载(相比之下 Sequelize 有 135 万次),这意味着尽管它可能没有那么广泛的应用,但仍有一批核心开发者偏爱其更精简的接口。在过去 6 个月中,其流行度似乎有所下降,npm 下载量减少了 36%。
评估:流行
仓库活跃度
在过去的一个月里,Bookshelf 仓库没有提交、没有发布版本,也没有合并的拉取请求。主分支大约一年没有新的提交了。截至本文撰写时,上一个版本是 2020 年 6 月 7 日的 1.2.0
。
评估:不甚活跃
支持
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 和回调接口
- 预加载(eager loading)和嵌套预加载关系
- 支持事务
- 社区插件扩展功能
有关完整功能列表,请查阅 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 星和 11.5 万次每周 npm 下载量,在流行度方面与 Bookshelf.js 接近,落后于 Prisma。它们都不如 Sequelize 和 TypeORM 流行,后者都有 2.5 万以上的星和超过 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构建
- 急切加载(Eager loading)
- 事务支持
- 根据JSON Schema验证模型
- 查询钩子(插入/更新前/后等)
- 图式插入更新(Graph upserts)
- 分页(Paging)
有关功能的完整列表,请查阅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的功能。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星标和3.7万次npm每周下载量。其3.7万次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公司管理和维护,该公司是一家在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是一个非常流行的JavaScript查询构建器,拥有1.54万个GitHub星标和104万次npm每周下载量。
评估:非常流行
仓库活跃度
在所考虑的数据月份中,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接口
- 流式接口
- 查询和Schema构建器
- 事务支持
- 连接池
- 标准化不同查询客户端和方言之间的响应
有关功能的完整列表,请查阅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的查询构建器以及Schema和实体生成器。
Slonik
Slonik位于node-postgres
数据库驱动之上一个层级。它是一系列实用程序的集合,内置了类型安全、查询模拟、连接和事务处理、详细日志记录、值插值以及许多其他功能。您仍然需要编写原始SQL,但它旨在在使用PostgreSQL数据库时增加安全性和效率。该库于2017年发布,在GitHub上仍然相当活跃并受到支持。
数据库驱动程序
在抽象层级的最低层是数据库驱动程序,它们可用于使用其查询语言直接与数据库进行交互。总结每个Node.js数据库客户端超出了本文的范围,但为方便起见,以下是主要数据库驱动程序的列表:
- PostgreSQL: node-postgres, pg-promise
- MySQL: mysql, node-mysql2, mysql-connector-nodejs
- SQLite: node-sqlite3
- MSSQL: node-sqlserver-v8, node-mssql, tedious
- MongoDB: node-mongodb-native
- Redis: node-redis, ioredis
总结
库 | 类型 | 受欢迎程度 | 活跃度 | 支持 | 成熟度和稳定性 | 官方支持的数据库 |
---|---|---|---|---|---|---|
Prisma | ORM + 查询构建器 | 💜💜 | 🌳🌳🌳🌳 | 🔵🔵🔵🔵 | 较新,由Prisma公司支持 | PostgreSQL、MySQL、MariaDB、SQLite、MSSQL(MongoDB、CockroachDB和PlanetScale处于预览阶段) |
Sequelize | ORM | 💜💜💜 | 🌳🌳 | 🔵🔵 | 成熟,无资金支持 | PostgreSQL、MySQL、MariaDB、SQLite、MSSQL |
TypeORM | ORM + 查询构建器 | 💜💜💜 | 🌳🌳🌳 | 🔵🔵🔵 | 成熟,由OpenCollective资助(1.5万美元) | PostgreSQL、MySQL、MariaDB、SQLite、MSSQL、CockroachDB、Oracle、Sap Hana |
Mongoose | ODM + 查询构建器 | 💜💜💜 | 🌳🌳🌳 | 🔵🔵🔵 | 成熟,由OpenCollective资助(6.7万美元),由Automattic支持 | MongoDB |
Bookshelf.js | ORM + 查询构建器 (knex.js) | 💜💜 | 🌳 | 🔵🔵 | 成熟,无资金支持 | PostgreSQL、MySQL、SQLite |
Objection.js | ORM + 查询构建器 (knex.js) | 💜💜 | 🌳🌳 | 🔵🔵🔵 | 成熟,无资金支持 | PostgreSQL、MySQL、SQLite |
Waterline | ORM | 💜 | 🌳 | 🔵🔵 | 成熟,由Sails公司支持 | PostgreSQL、MySQL、MongoDB |
Knex.js | 查询构建器 | 💜💜💜 | 🌳🌳🌳 | 🔵🔵🔵 | 成熟,无资金支持 | PostgreSQL、MySQL、MariaDB、SQlite、MSSQL、Oracle、Amazon Redshift |
结论
本文总结了最流行的Node.js ORM、数据库工具包和查询构建器。根据仓库贡献和开发者支持等标准评估了它们作为开源项目的健康状况。
本文并非选择Node.js数据库接口的详尽框架,其他因素,如软件包的编程接口、设计、对数据库功能的支持以及灵活性,可能比本文评估的许多标准更为重要。不同的Node.js项目可能需要不同的工具。
要了解更多关于查询构建器和ORM的信息,请查阅Prisma的数据指南中名为“比较SQL、查询构建器和ORM”的文章,这是一个免费有用的知识库,用于学习数据库、数据建模等更多内容。