分享到

簡介

為您的 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 的 資料指南

Prisma

評估總結

  • 人氣:受歡迎
  • 儲存庫活動:非常活躍
  • 支援:強大
  • 成熟度和穩定性: 較新
  • 支援的資料庫:MySQL、PostgreSQL、MSSQL 和 SQLite(MongoDB、CockroachDB 和 PlanetScale 處於預覽支援中)

概述

Prisma 與大多數 ORM 的不同之處在於,模型不是在類別中定義,而是在 Prisma 結構描述中定義,Prisma 結構描述是 Prisma 工具組使用的主要組態和資料模型定義檔案。在 Prisma 結構描述中,您定義資料來源(例如 PostgreSQL 資料庫)和模型(例如 usersposts)以及它們之間的關係。使用此結構描述,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 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 結構描述,以減少物件關聯阻抗失配
  • 型別安全資料庫查詢
  • 自動產生的遷移(預覽)
  • 直覺的關係 API
  • VSCode 外掛程式
  • 自動完成支援

如需完整功能列表,請參閱 Prisma 官方文件中的資料庫功能

使用範例

關係查詢(擷取給定使用者的所有貼文,給定使用者的電子郵件)

const postsByUser = await prisma.user
.findOne({ where: { email: 'alice@prisma.io' } })
.posts()

總結

雖然 Prisma 是一個較新的資料庫工具,並且經歷了多次迭代和重新設計,但其獨特的、以結構描述為中心的架構與典型的 ORM 形成對比,後者使用 JavaScript 類別來定義模型。它受益於一家資金充足的公司和付費開發人員的支持,以及活躍的支援社群和快速的開發週期。它是一種受歡迎、快速成長的選擇,並且將會繼續存在。

Sequelize

評估總結

  • 人氣:非常受歡迎
  • 儲存庫活動:非常活躍
  • 支援:普通
  • 成熟度和穩定性: 非常成熟
  • 支援的資料庫:MySQL、MariaDB、SQLite 和 Microsoft SQL Server

概述

Sequelize 是一個已建立、成熟、基於 Promise 的 Node.js ORM,支援 PostgreSQL、MySQL、MariaDB、SQLite 和 Microsoft SQL Server。它遵循傳統的 ORM 模式,透過擴展 Model 類別來定義模型。然後使用類別方法執行 SELECTINSERT 等操作。關係也使用 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 等地方獲得支援。該專案目前的活動量明顯高於近年來,這是一個好兆頭。

TypeORM

評估總結

  • 人氣:非常受歡迎
  • 儲存庫活動:活躍
  • 支援:良好
  • 成熟度和穩定性: 成熟
  • 支援的資料庫:MySQL、MariaDB、PostgreSQL、CockroachDB、SQLite、Microsoft SQL Server、Oracle、SAP Hana、sql.js

概觀

TypeORM 是一個受 Hibernate 影響的 JavaScript 和 TypeScript ORM,可以運行在多個平台,如 Node.js、網頁瀏覽器和 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 issue 上獲得太多幫助。

評估:良好

成熟度和穩定性

雖然成熟度與 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 README

使用範例

在 TypeORM 中查詢特定使用者的所有貼文

const userRepository = getRepository(User)
const user = await userRepository.findOne(id, {
relations: ['posts'],
})

總結

TypeORM 和 Sequelize 是兩個最受歡迎的關聯式資料庫 ORM。TypeORM 與 Sequelize 的不同之處在於,它提供了更多的彈性,允許您在不同的使用模式之間進行選擇,並且還包含一個強大的查詢建構器。TypeORM 支援許多流行的資料庫,並且該專案仍然活躍,儘管完全依賴其開源貢獻者。

Mongoose

評估總結

  • 人氣:非常受歡迎
  • 儲存庫活動:活躍
  • 支援:良好
  • 成熟度和穩定性: 成熟
  • 支援的資料庫:MongoDB

概觀

Mongoose 是一個受歡迎且維護良好的 Node.js 物件模型工具,用於 MongoDB。嚴格來說,Mongoose 是一個物件文件映射器,因為 MongoDB 是一個基於文件的資料庫。它允許您使用 Schema 建立資料模型,並且包含內建的類型轉換、驗證、查詢建構和商業邏輯 Hook。

受歡迎程度

Mongoose 是最受歡迎的 JavaScript 資料模型工具,用於 MongoDB 資料庫。它在 GitHub 上有 23.9k 個星星,每週 npm 下載量為 190 萬次。

評估: 非常受歡迎

儲存庫活動

Mongoose 的 GitHub 儲存庫相當活躍。在過去一個月中,所有分支共有 199 次提交,以及 58 個合併的 PR。最近的提交重點是錯誤修復、新增功能和文件。版本發布似乎相當頻繁,在考量的時間段內發布了 5 個版本。

評估:活躍

支援

Mongoose 的文件包含其最常見操作的使用指南,例如查詢、建立模型和驗證。其 API 文件也包含許多有用的程式碼片段。它有一個 Slack 和 Gitter 社群(儘管兩者都相對安靜),您可以期望在 Reddit 和 StackOverflow 上找到許多支援和提示。其 GitHub issue 區塊也相當活躍,大多數 issue 都會收到維護者或其他 Mongoose 使用者的某種回應或支援。

評估:良好

成熟度和穩定性

Mongoose 自 2011 年以來就已存在,使其成為本文中考量的最成熟專案之一。如果您想將 Node.js ODM 與 MongoDB 一起使用,您可以相信 Mongoose 介面不會發生劇烈變化,並且它將與 MongoDB 版本保持同步更新。它擁有令人印象深刻的開源資金支持,年度預算為 67,000 美元,完全來自 OpenCollective 貢獻者。透過一系列收購,擁有 Wordpress.com、Tumblr 和 Simplenote 的公司 Automattic 繼承了 Mongoose。Terra Vera、SixPlus 和 Payment Ninja 都是使用 Mongoose 建構的。

評估:成熟

資料庫支援

MongoDB

主要功能

  • NoSQL 資料庫的 Schema 和模型
  • 驗證器、前置和後置中介軟體 Hook
  • 使用 populate() 參考其他集合中的文件
  • 子文件:在其他 Schema 中巢狀 Schema

如需完整的功能列表,請參閱 Mongoose 官方文件

使用範例

關係查詢(擷取給定使用者的所有貼文,給定使用者的電子郵件)

const userWithPosts = await User.findOne({
email: 'alice@mongoose.com',
}).populate('posts')

總結

如果您正在 Node 中使用 MongoDB 資料庫,並且想要使用 ODM,Mongoose 是一個安全的選擇。它是一個受歡迎、成熟的專案,並且持續積極維護。它允許您定義 Schema 來建立資料模型,並提供驗證、類型轉換、填充、中介軟體、自訂方法和查詢輔助程式等功能。

Bookshelf.js

評估總結

  • 人氣:受歡迎
  • 儲存庫活動:不是很活躍
  • 支援:普通
  • 成熟度和穩定性: 成熟
  • 支援的資料庫:PostgreSQL、MySQL 和 SQLite

概觀

Bookshelf.js 是一個 Node.js ORM,建立在 Knex.js 查詢建構器函式庫之上。它受到資料映射器 ORM 模式的啟發,並提供一個精簡的介面,用於建立資料模型和與資料互動。

受歡迎程度

Bookshelf.js 擁有 6.3k 個 GitHub 星星,雖然不如 Sequelize 和 TypeORM 受歡迎,但在人氣上與 Objection.js 和 Waterline.js 處於同一範圍。它的每週下載量為 82k(相較於 Sequelize 的 135 萬),這表示儘管它可能沒有被廣泛採用,但仍然有一群核心開發人員偏好其更精簡的介面。它的受歡迎程度似乎正在減弱,過去 6 個月的 npm 下載量下降了 36%。

評估: 受歡迎

儲存庫活動

在過去一個月裡,Bookshelf 儲存庫中沒有任何提交,沒有發布版本,也沒有合併任何 Pull Request。大約一年來,主分支沒有進行任何新的提交。撰寫本文時,最新的版本發布於 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

評估總結

  • 人氣:受歡迎
  • 儲存庫活動:尚稱活躍
  • 支援:良好
  • 成熟度和穩定性: 成熟
  • 支援的資料庫:SQLite、Postgres 和 MySQL

概觀

Objection.js 自稱為更像是一個「關聯式查詢建構器」,而不是 ORM。與 Bookshelf.js 類似,它建立在強大的 Knex.js 查詢建構器函式庫之上,因此在靈活的查詢建構器之上建構了類似 ORM 的功能,您可以隨時切換回查詢建構器。

受歡迎程度

Objection.js 擁有 6.5k 個 GitHub 星星和每週 115k 次 npm 下載量,在受歡迎程度上與 Bookshelf.js 相近,並且落後於 Prisma。它們都不如 Sequelize 和 TypeORM 受歡迎,後兩者都擁有 25k+ 星星和超過 90 萬的每週下載量。

評估: 受歡迎

儲存庫活動

在本文考量的時間段內,Objection.js 儲存庫沒有任何提交或合併的 PR。Objection 的最新版本發布於 2021 年 12 月 31 日,其中包含一些錯誤修復。雖然不如 Prisma 和 TypeORM 等專案活躍,但它仍在積極維護中。

評估:尚稱活躍

支援

Objection 的文件包含一份使用指南,涵蓋其主要功能,例如建立模型和關聯、查詢、交易、Hook 和驗證。它還包含 API 文件和一本「食譜書」,其中包含常見操作(如 Join 和子查詢)的範例。您在 StackOverflow 上找不到太多幫助,但該專案的 Gitter 相當活躍且提供支援,它在 Reddit 上也有一定程度的存在感,並且其維護者經常回應 GitHub issue。

評估:良好

成熟度和穩定性

Objection 自 2015 年以來就已發布,是一個成熟的專案。它似乎沒有任何形式的財務或企業支持,並且由開源社群維護。如需 Objection.js 生產環境使用案例列表,請參閱[誰在生產環境中使用 objection.js?](誰在生產環境中使用 objection.js?)

評估:成熟

資料庫支援

SQLite、PostgreSQL 和 MySQL

主要功能

  • 建立在 Knex.js 之上
  • 預先載入
  • 交易支援
  • 根據 JSON Schema 驗證模型
  • 查詢 Hook(插入前/後、更新等)
  • 圖形 Upsert
  • 分頁

如需完整的功能列表,請參閱 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 似乎比 Bookshelf.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 倉庫最近似乎不是很活躍,在考量數據的那個月內,有 0 次提交和合併的 PR。它的上次發布是在 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: '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 擁有 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': '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)的影響,它是一個受資料映射器、身份映射和工作單元影響的 ORM。它的一些功能包括自動事務處理、對多個資料庫的支援、內建的基於 Knex.js 的查詢建構器以及架構和實體產生器。

Slonik

Slonik 位於 node-postgres 資料庫驅動程式之上的層級。它是一個實用程式集合,內建類型安全、查詢模擬、連線和事務處理、詳細日誌記錄、值插值和許多其他功能。您仍然需要編寫原始 SQL,但它旨在在使用 PostgreSQL 資料庫時增加安全性和效率。該函式庫於 2017 年發布,至今在 GitHub 上仍然非常活躍並受到支援。

資料庫驅動程式

在抽象光譜的最底層是資料庫驅動程式,它們可以用於使用其查詢語言直接與您的資料庫互動。總結每個 Node.js 資料庫用戶端超出了本文的範圍,但為了方便起見,以下列出主要資料庫驅動程式

總結

函式庫類型人氣活動支援成熟度和穩定性官方支援的資料庫
PrismaORM + 查詢建構器💜💜🌳🌳🌳🌳🔵🔵🔵🔵較新,由公司 Prisma 支持PostgreSQL、MySQL、MariaDB、SQLite、MSSQL(MongoDB、CockroachDB 和 PlanetScale 預覽中)
SequelizeORM💜💜💜🌳🌳🔵🔵成熟,無資金PostgreSQL、MySQL、MariaDB、SQLite、MSSQL
TypeORMORM + 查詢建構器💜💜💜🌳🌳🌳🔵🔵🔵成熟,OpenCollective 資助($1.5 萬美元)PostgreSQL、MySQL、MariaDB SQLite、MSSQL、CockroachDB、Oracle、Sap Hana
MongooseODM + 查詢建構器💜💜💜🌳🌳🌳🔵🔵🔵成熟,OpenCollective 資助($6.7 萬美元),由 Automattic 支持MongoDB
Bookshelf.jsORM + 查詢建構器 (knex.js)💜💜🌳🔵🔵成熟,無資金PostgreSQL、MySQL、SQLite
Objection.jsORM + 查詢建構器 (knex.js)💜💜🌳🌳🔵🔵🔵成熟,無資金PostgreSQL、MySQL、SQLite
WaterlineORM💜🌳🔵🔵成熟,由 Sails Company 支持PostgreSQL、MySQL、MongoDB
Knex.js查詢建構器💜💜💜🌳🌳🌳🔵🔵🔵成熟,無資金PostgreSQL、MySQL、MariaDB、SQlite、MSSQL、Oracle、Amazon Redshift

結論

本文總結了最受歡迎的 Node.js ORM、資料庫工具包和查詢建構器。根據儲存庫貢獻和開發人員支援等標準評估了它們作為開源專案的健康狀況。

它並非旨在作為選擇 Node.js 資料庫介面的詳盡框架,其他因素(如套件的程式設計介面、設計、對資料庫功能的支援和靈活性)可能比此處評估的大多數標準重要得多。不同的 Node.js 專案可能需要不同的工具。

要了解有關查詢建構器和 ORM 的更多資訊,請參閱 比較 SQL、查詢建構器和 ORM,來自 Prisma 的資料指南,這是一個免費且有用的知識庫,用於學習有關資料庫、資料建模以及更多內容。