数据库工具
2022 年 Node.js 最佳 11 个 ORM、查询构建器和数据库库
简介
为您的 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 模式中,您可以定义数据源,例如 PostgreSQL 数据库,以及模型,例如 users
和 posts
以及它们之间的关系。使用此模式,Prisma 会生成一个 *客户端*,它会公开一个创建-读取-更新-删除 (CRUD) API,然后您可以使用它来查询数据库。这个 Prisma 客户端充当一个丰富的查询构建器,您可以在 Node.js 应用程序中使用它来返回纯 JavaScript 对象,而不是模型类的实例。
流行度
Prisma 在 Prisma GitHub 仓库 上拥有 20.7k 星,是 Node 开发人员中流行的数据库工具,与 Bookshelf.js 和 Objection.js 等成熟库相当,但不如 Sequelize 和 TypeORM 等库流行,后者拥有超过 25k 的 GitHub 星。值得注意的是,Prisma 仅在 2020 年 6 月发布用于生产环境,而大多数其他工具已经存在好几年了。
在 npm 下载量方面,在本文所考虑的时间段内,Prisma 每周有 362k 次下载,高于 Bookshelf.js 和 Objection.js 等工具,但与 Sequelize、TypeORM 和 Mongoose 处于同一级别。然而,在本文中考虑的所有主要工具中,Prisma 的增长率最高,在过去 6 个月中,npm 下载量增长了 94%。
评估:流行
仓库活动
可以肯定地说,Prisma GitHub 仓库是本文中考虑的所有工具中最活跃的。在本文中考虑的数据月份内,Prisma 有 258 次提交、3 次发布和 101 个合并的 PR,它正在积极开发中。新功能、错误修复和更新频繁发布,每两周就会发布新版本。
评估:非常活跃
支持
尽管 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 年发布了测试版,随后去除了 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 模式,减少对象-关系阻抗不匹配
- 类型安全的数据库查询
- 自动生成的迁移(预览)
- 直观的关联 API
- VSCode 插件
- 自动完成功能支持
有关完整的功能列表,请参阅 Prisma 官方文档的 数据库功能。
使用示例
关联查询(获取给定用户的所有帖子,给定用户的电子邮件)
const postsByUser = await prisma.user.findOne({ where: { email: '[email protected]' } }).posts()
总结
尽管 Prisma 是一个较新的数据库工具,并且经历了多次迭代和重新设计,但它独特的以模式为中心的架构与典型使用 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 在 GitHub 上拥有 25.7k 个星标,每周 npm 下载量为 135 万,是本文中考虑的最受欢迎的关系型数据库 ORM。它仍在增长,过去 6 个月的 npm 下载量增长了 14%。相比之下,下一个最受欢迎的关系型数据库 ORM 是 TypeORM,每周 npm 下载量为 918k。(Mongoose 也很受欢迎,但只支持 MongoDB。)
评估:非常受欢迎
仓库活动
在本文考虑的时间段内,Sequelize 发布了 10 个新版本,推送了 179 次提交(所有分支),合并了 86 个 PR。这表明 Sequelize 非常活跃。
评估:非常活跃
支持
Sequelize 已经存在近十年,您可能会通过 StackOverflow 或 Reddit 搜索找到它的支持。它的文档很全面,包含许多使用示例,还有一些关于使用模式的更理论性的讨论(例如它的 关联 文档)。但是,Sequelize 的 GitHub 问题和 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: '[email protected]',},include: Post,})
总结
Sequelize 是一个成熟的、稳定的 ActiveRecord ORM,由于其流行度和多年来的大量使用,您可以期待从 StackOverflow、Reddit 和 GitHub 问题等地方获得支持。该项目目前比过去几年有明显更多的活动,这是一个好兆头。
要更详细地比较 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 架构模式:数据映射器和活动记录,为开发人员提供在两者之间进行选择的灵活性。它还包括一个查询构建器。
流行度
自 2016 年发布以来,TypeORM 发展迅速,成为最受欢迎的 JavaScript 和 TypeScript ORM 之一。它在 GitHub 上拥有 27.2k 个星标,每周 npm 下载量为 918k,使其成为最受欢迎的 ORM 选择之一,与 Sequelize 和 Mongoose 并驾齐驱。
评估:非常受欢迎
仓库活动
TypeORM 的 GitHub 仓库很活跃。在过去一个月,推送了 74 次提交(所有分支),合并了 41 个 PR。似乎没有严格的发布计划,最新版本发布在 2021 年 11 月。
评估:活跃
支持
TypeORM 的文档很好,还涵盖了数据库概念,如迁移、关系和 ORM 模式(如数据映射器和活动记录)。它有一个有点活跃的 Slack 社区,以及中等程度的 Reddit 和 StackOverflow 存在,但是您不太可能通过 GitHub 问题获得太多帮助。
评估:良好
成熟度和稳定性
虽然与 Prisma 相当成熟,但 TypeORM 的设计自首次发布以来变化较小,它是一个受 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 自述文件。
使用示例
在 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 是一个流行且维护良好的 Node.js 对象建模工具,用于 MongoDB。严格来说,Mongoose 是一个对象文档映射器,因为 MongoDB 是一个基于文档的数据库。它允许您使用模式对数据进行建模,并且包含内置的类型转换、验证、查询构建和业务逻辑钩子。
受欢迎程度
Mongoose 是最流行的用于 MongoDB 数据库的 JavaScript 数据建模工具。它在 GitHub 上有 23.9k 星,每周 npm 下载量为 190 万。
评估:非常受欢迎
代码库活动
Mongoose 的 GitHub 代码库非常活跃。在过去的一个月里,各分支机构进行了 199 次提交,合并了 58 个 PR。最近的提交重点在于修复 bug、添加功能和编写文档。发布似乎相当频繁,在考虑的时间段内有 5 次发布。
评估:活跃
支持
Mongoose 的文档包含其最常见操作的使用指南,例如查询、创建模型和验证。其 API 文档也包含许多有用的代码段。它有一个 Slack 和 Gitter 社区(尽管两者都比较安静),并且您可以在 Reddit 和 StackOverflow 上找到很多支持和技巧。其 GitHub 问题部分也很活跃,大多数问题都会收到维护者或其他 Mongoose 用户的某种回复或支持。
评估:良好
成熟度和稳定性
Mongoose 自 2011 年就已存在,是本文中考虑的最成熟的项目之一。如果您想使用一个 Node.js ODM 与 MongoDB,您可以相信 Mongoose 接口不会发生根本性变化,并且它会与 MongoDB 版本保持同步。它拥有令人印象深刻的开源资金支持,从 OpenCollective 贡献者那里获得了 67000 美元的年度预算。通过一系列收购,拥有 Wordpress.com、Tumblr 和 Simplenote 的公司 Automattic 继承了 Mongoose。Terra Vera、SixPlus 和 Payment Ninja 都是使用 Mongoose 构建的。
评估:成熟
数据库支持
MongoDB
主要功能
- NoSQL 数据库的模式和模型
- 验证器、预中间件和后中间件钩子
- 使用
populate()
引用其他集合中的文档 - 子文档:在其他模式中嵌套模式
有关完整的功能列表,请查阅 Mongoose 官方文档。
使用示例
关联查询(获取给定用户的所有帖子,给定用户的电子邮件)
const userWithPosts = await User.findOne({email: '[email protected]',}).populate('posts')
总结
如果您使用的是 MongoDB 数据库并希望使用 ODM,那么 Mongoose 是一个安全的选择。它是一个流行的成熟项目,并持续得到积极维护。它允许您定义模式以对数据进行建模,并提供验证、类型转换、填充、中间件、自定义方法和查询助手等功能。
有关 Prisma 和 Mongoose 的更详细比较,您可以查看我们的 Mongoose 比较页面。
Bookshelf.js
评估总结
- 流行度:流行
- 仓库活动: 不活跃
- 支持: 一般
- 成熟度和稳定性:成熟
- 支持的数据库: PostgreSQL、MySQL 和 SQLite
概述
Bookshelf.js 是一个基于 Knex.js 查询构建器库构建的 Node.js ORM。它受 Data Mapper ORM 模式的启发,并提供了一个精简的接口,用于对数据进行建模和交互。
流行度
Bookshelf.js 在 GitHub 上拥有 6.3k 星星,不如 Sequelize 和 TypeORM 受欢迎,但与 Objection.js 和 Waterline.js 处于同一水平。它每周有 82k 次下载量(而 Sequelize 有 135 万次),这意味着尽管它可能没有那么广泛采用,但它仍然拥有一批核心开发者,他们更喜欢它更精简的接口。它的流行度似乎有所下降,过去 6 个月 npm 下载量下降了 36%。
评估:流行
仓库活动
在过去一个月中,Bookshelf 仓库中没有提交、发布或合并的拉取请求。大约一年来,主分支中没有新的提交。截至撰写本文时,最后一个版本是 1.2.0
,于 2020 年 6 月 7 日发布。
评估:不活跃
支持
Bookshelf 的核心文档包含一个简短的快速入门指南和一些关于创建不同关系类型的代码片段。然而,它的 API 文档相当广泛,包含许多使用示例。Bookshelf 拥有一个 IRC 频道,但只有 7 名成员,而且看起来很安静。类似地,StackOverflow 和 Reddit 上的支持也比较少。最好的选择是它的 GitHub 问题页面,尽管你仍然可能难以引起贡献者的注意。
评估:平均
成熟度和稳定性
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 在 GitHub 上拥有 6.5k 星星,每周 npm 下载量为 115k,在受欢迎程度方面与 Bookshelf.js 相当,落后于 Prisma。他们都不如 Sequelize 和 TypeORM 受欢迎,Sequelize 的星数超过 25k,每周下载量超过 900k。
评估:流行
仓库活动
在本文考虑的时间段内,Objection.js 仓库中没有提交或合并的 PR。Objection 的最后一个版本发布于 2021 年 12 月 31 日,包含一些错误修复。虽然不像 Prisma 和 TypeORM 这样的项目那样活跃,但它仍在积极维护。
评估:有些活跃
支持
Objection 的文档包含一个使用指南,涵盖了它的主要功能,例如创建模型和关系、查询、事务、钩子和验证。 它还包含 API 文档和一个“食谱集”,其中包含常见操作(例如连接和子查询)的示例。 你在 StackOverflow 上找不到太多帮助,但项目的 Gitter 相当活跃且支持,它在 Reddit 上也有一定的存在感,其维护者经常回复 GitHub 问题。
评估:良好
成熟度和稳定性
Objection 自 2015 年推出,是一个成熟的项目。 它似乎没有任何财务或公司支持,并且由开源社区维护。 有关 Objection.js 的生产用例列表,请咨询[谁在生产中使用 objection.js?](谁在生产中使用 objection.js?)
评估:成熟
数据库支持
SQLite、PostgreSQL 和 MySQL
显著功能
- 基于 Knex.js 构建
- 急切加载
- 事务支持
- 根据 JSON Schema 验证模型
- 查询钩子(插入前/后、更新等)
- 图上更新
- 分页
有关功能的完整列表,请参阅 Objection.js GitHub README。
使用示例
关联查询(获取给定用户的所有帖子,给定用户的电子邮件)
const user = await User.query().findOne({email: '[email protected]',})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,在 GitHub 上拥有 5.3k 个星标,每周 npm 下载量为 37k。 它的 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 Company 管理和维护,Sails Company 是一家私营的种子基金公司,孵化于 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: '[email protected]' }).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 在 GitHub 上拥有 15.4k 个星标,每周 npm 下载量为 104 万,是一个非常受欢迎的 JavaScript 查询构建器。
评估:非常受欢迎
仓库活动
在考虑的数据月中,Knex.js 在所有分支上推送了 42 次提交,合并了 26 个 PR,并发布了 3 个版本。最近的提交包括错误修复和功能。
评估:活跃
支持
Knex.js 的文档主要包含对其 API 的完整文档,该 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': '[email protected]',}).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)的影响,它是一个数据映射器、标识映射和工作单元影响的 ORM。它的一些功能包括自动事务处理、支持多种数据库、内置的基于 Knex.js 的查询构建器以及模式和实体生成器。
Slonik
Slonik 位于 node-postgres
数据库驱动程序之上。它是一组实用程序,在其中构建了类型安全性、查询模拟、连接和事务处理、详细日志记录、值插值以及许多其他功能。您仍然需要编写原始 SQL,但它的设计旨在为使用 PostgreSQL 数据库时增加一层安全性 and 效率。该库于 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, and PlanetScale 预览) |
Sequelize | ORM | 💜💜💜 | 🌳🌳 | 🔵🔵 | 成熟,无资金支持 | PostgreSQL, MySQL, MariaDB, SQLite, MSSQL |
TypeORM | ORM + 查询构建器 | 💜💜💜 | 🌳🌳🌳 | 🔵🔵🔵 | 成熟,由 OpenCollective 资助($15k) | PostgreSQL, MySQL, MariaDB SQLite, MSSQL, CockroachDB, Oracle, Sap Hana |
Mongoose | ODM + 查询构建器 | 💜💜💜 | 🌳🌳🌳 | 🔵🔵🔵 | 成熟,由 OpenCollective 资助($67k),由 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 的信息,请查阅 比较 SQL、查询构建器和 ORM,来自 Prisma 的数据指南,这是一个免费的、有用的知识库,用于学习数据库、数据建模以及更多其他内容。