数据库工具
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 仓库是最活跃的。在本文考虑的数据月份中,Prisma 进行了 258 次提交、3 次发布和 101 次合并的 PR,Prisma 正在积极开发中。新功能、错误修复和更新会频繁推送,每两周发布新版本。
评估: 非常活跃
支持
虽然 Prisma 的出现时间不如此处考虑的其他一些工具,但它受益于强大而活跃的开发者支持网络。它的 文档组织良好、正在积极扩展并且非常全面。
如果您有问题,可以使用 Prisma Slack 频道,在他们的 GitHub Discussions 页面上提问,或提交 GitHub Issue,所有这些都非常活跃。虽然没有像 StackOverflow 那样庞大的问题库可供借鉴,但 GitHub 讨论和 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: '[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 拥有 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: '[email protected]',},include: Post,})
总结
Sequelize 是一个已建立的、稳定的 ActiveRecord ORM,由于其受欢迎程度和多年来的大量使用,您可以期望从 StackOverflow、Reddit 和 GitHub Issues 等地方获得支持。该项目目前的活跃度明显高于近年,这是一个好兆头。
要更侧重于 Prisma 和 Sequelize 的比较,您可以查看我们的Sequelize 比较页面。
TypeORM
评估总结
- 受欢迎程度:非常受欢迎
- Repo Activity: 活跃
- Support: 良好
- Maturity and Stability: 成熟
- Supported Databases: 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 时获得太多帮助。
评估: 良好
成熟度和稳定性
虽然与 Prisma 的成熟度相当,但 TypeORM 的设计自最初发布以来变化较小,它是一个受 Hibernate 影响的 ORM,专为 TypeScript 构建(也适用于 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
评估总结
- 受欢迎程度:非常受欢迎
- Repo Activity: 活跃
- Support: 良好
- Maturity and Stability: 成熟
- Supported Databases: 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 部分也非常活跃,大多数 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: '[email protected]',}).populate('posts')
总结
如果您正在将 MongoDB 数据库与 Node 一起使用,并且想要使用 ODM,那么 Mongoose 是一个安全的选择。它是一个流行的、成熟的项目,并且仍在积极维护中。它允许您定义模式来建模您的数据,并提供诸如验证、类型转换、填充、中间件、自定义方法和查询助手等功能。
有关 Prisma 和 Mongoose 的更集中的比较,您可以查看我们的 Mongoose 比较页面。
Bookshelf.js
评估总结
- 受欢迎程度:受欢迎
- Repo Activity: 不是非常活跃
- 支持:一般
- Maturity and Stability: 成熟
- Supported Databases: PostgreSQL, MySQL, 和 SQLite
概述
Bookshelf.js 是构建在 Knex.js 查询构建器库之上的 Node.js ORM。它受到数据映射器 ORM 模式的启发,并为建模和与数据交互提供了精简的接口。
受欢迎程度
Bookshelf.js 拥有 6.3k 个 GitHub 星标,不如 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 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
评估总结
- 受欢迎程度:受欢迎
- Repo Activity: 有些活跃
- Support: 良好
- Maturity and Stability: 成熟
- Supported Databases: 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: '[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
评估总结
- 受欢迎度: 略受欢迎
- Repo Activity: 不是非常活跃
- 支持:一般
- Maturity and Stability: 成熟
- 支持的数据库: 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: '[email protected]' }).populate('posts')
总结
Waterline 是 Sails.js JavaScript 框架内置的 ORM/ODM,因此其主要目标一直是支持多种数据库类型(关系型和 NoSQL),而无需重写代码。近几个月来,该项目停滞不前,支持不如本文中考虑的其他一些库那么强大。
Knex.js (查询构建器)
评估总结
- 受欢迎程度:非常受欢迎
- Repo Activity: 活跃
- Support: 良好
- Maturity and Stability: 成熟
- 支持的数据库: 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': '[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 数据库时增加安全性和效率。该库于 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 资助($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 的数据指南,这是一个免费的知识库,可帮助您了解数据库、数据建模等等。