数据库工具
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 问题 |
| 支持 | 开发人员会得到良好的支持吗? | 文档质量、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 数据库)和模型(如 users 和 posts)以及它们之间的关系。使用此模式,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 仓库是本文考虑的所有工具中最活跃的。在本文考虑的数据月份中,有 258 次提交、3 次发布和 101 个合并的 PR,Prisma 正在积极开发中。新功能、错误修复和更新频繁推送,每两周发布新版本。
评估:非常活跃
支持
尽管 Prisma 的存在时间不如本文考虑的一些其他工具,但它受益于强大而活跃的开发人员支持网络。其 文档组织良好,正在积极扩展,并且非常彻底。
如果您有问题,可以使用 Prisma Slack 频道,在他们的 GitHub 讨论页面提问,或提交 GitHub Issue,所有这些都非常活跃。尽管 StackOverflow 问题库没有那么大,但 GitHub 讨论和 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 是一个由私营公司 Prisma 维护、支持和积极开发的开源 JavaScript ORM,该公司最近完成了 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 形成对比。它受益于一家获得资助的公司和付费开发人员的支持,以及活跃的支持社区和快速的开发周期。它是一个流行、快速增长的选择,并将持续存在。
如果您想了解更多关于我们认为 Prisma 是一个很好的选择的原因,请查看我们的 为什么选择 Prisma?页面。
Sequelize
评估摘要
- 流行度:非常流行
- 仓库活动:非常活跃
- 支持:一般
- 成熟度和稳定性:非常成熟
- 支持的数据库:MySQL、MariaDB、SQLite 和 Microsoft SQL Server
概述
Sequelize 是一个成熟、稳定的、基于 Promise 的 Node.js ORM,支持 PostgreSQL、MySQL、MariaDB、SQLite 和 Microsoft SQL Server。它遵循通过扩展 Model 类定义模型的传统 ORM 模式。然后使用类方法执行 SELECT 和 INSERT 等操作。关系也使用 hasMany() 和 belongsTo() 等类方法定义。
流行度
在考虑的时间段内,Sequelize 拥有 25.7k GitHub 星级和 135 万 npm 每周下载量,是本文中考虑的最受欢迎的关系数据库 ORM。它仍在增长,在过去 6 个月内 npm 下载量增长了 14%。相比之下,下一个最受欢迎的关系数据库 ORM 是 TypeORM,每周 npm 下载量为 918k。(Mongoose 也非常受欢迎,但只支持 MongoDB。)
评估:非常流行
仓库活动
在考虑的时间段内,发布了 10 个新版本的 Sequelize,推送了 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 架构模式,为开发人员提供了选择灵活性。它还包含一个查询构建器。
流行度
自 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 issues 获得太多帮助。
评估:良好
成熟度和稳定性
尽管 TypeORM 在成熟度上与 Prisma 相当,但自最初发布作为受 Hibernate 影响的 TypeScript 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 支持许多流行的数据库,并且该项目仍然活跃,尽管完全依赖其开源贡献者。
有关 Prisma 和 TypeORM 更集中的比较,您可以查看我们的 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 部分也非常活跃,大多数问题都会收到维护者或其他 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')
总结
如果您正在使用带有 Node 的 MongoDB 数据库并希望使用 ODM,Mongoose 是一个可靠的选择。它是一个流行、成熟的项目,并且仍在积极维护。它允许您定义一个模式来对数据进行建模,并提供验证、类型转换、填充、中间件、自定义方法和查询助手等功能。
有关 Prisma 和 Mongoose 更集中的比较,您可以查看我们的 Mongoose 比较页面。
Bookshelf.js
评估摘要
- 流行度:流行
- 仓库活动:不太活跃
- 支持:一般
- 成熟度和稳定性:成熟
- 支持的数据库:PostgreSQL、MySQL 和 SQLite
概述
Bookshelf.js 是一个基于 Knex.js 查询构建器库构建的 Node.js ORM。它受到数据映射器 ORM 模式的启发,并提供了一个精简的接口,用于建模和与您的数据交互。
流行度
Bookshelf.js 在 GitHub 上拥有 6.3k 星级,不如 Sequelize 和 TypeORM 流行,但与 Objection.js 和 Waterline.js 处于同一范围内。它每周下载量为 82k(相比之下,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 和回调接口
- 即时加载和嵌套即时加载关系
- 支持事务
- 社区插件扩展功能
有关功能的完整列表,请参阅 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 流行,两者都在 25k+ 星级和 900k+ 每周下载量范围内。
评估:流行
仓库活动
在本文考虑的时间段内,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 验证模型
- 查询钩子(前置/后置插入、更新等)
- 图表更新
- 分页
有关功能的完整列表,请参阅 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 星级和 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 公司管理和维护,这是一家由 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 拥有 1.54 万 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 接口
- 流式接口
- 查询和 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 类似,它可以连接到您的数据库并内省其 schema 以构建数据库中编码的数据模型的 API。它包括一个动态查询构建器和事务支持,专为 PostgreSQL 设计,因此支持其独特的功能集,如数组字段和操作、正则表达式匹配、外部表和物化视图。
Mikro-ORM
Mikro-ORM 是一个较新的 TypeScript ORM,也支持原生 JavaScript。由于它主要是一个 TypeScript ORM,因此本文未对其进行全面评估。Mikro-ORM 是一个快速增长的项目,在 GitHub 上非常活跃,并得到其开发者的强力支持。受 Doctrine(一个 PHP ORM)的影响,它是一个数据映射器、身份映射和工作单元影响的 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 的文章,这是一个免费的有用知识库,可用于学习数据库、数据建模等等。