資料庫工具
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”的文章,這是一個免費有用的知識庫,用於學習資料庫、資料建模等更多內容。