データベースツール
2022年のNode.js用ORM、クエリビルダー、データベースライブラリ ベスト11
はじめに
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
データをクエリおよび操作するためのライブラリは、それぞれ異なる抽象化レベルで動作する3つのカテゴリに大別できます。
低い方から高い方へ、これらは以下の通りです。
- node-postgresのようなデータベースドライバー、クライアント、コネクタ
- Knex.jsのようなクエリビルダー。これらはデータベースクライアントよりも高いレベルで動作し、JavaScriptコードを記述してデータを操作およびクエリできます。
- Sequelizeのようなオブジェクトリレーショナルマッピングツール (ORM) や、Prismaのようなデータベースツールキット。これらは開発者がデータベーステーブルに対応する抽象的なエンティティであるモデルを扱えるようにします。
多くのツールはこれらの境界を曖昧にし、追加の柔軟性や制御が必要な場合に開発者がより低いレベルに降りて操作できるようにしています。詳細については、PrismaのデータガイドからSQL、クエリビルダー、およびORMの比較をご参照ください。
Prisma
評価概要
- 人気度:人気
- リポジトリ活動:非常に活発
- サポート:強力
- 成熟度と安定性:比較的新しい
- サポートされているデータベース:MySQL、PostgreSQL、MSSQL、およびSQLite(MongoDB、CockroachDB、PlanetScaleはプレビューサポート中)
概要
Prismaは、ほとんどのORMとは異なり、モデルがクラスではなく、Prismaツールキットが使用する主要な設定およびデータモデル定義ファイルであるPrismaスキーマで定義されます。Prismaスキーマでは、PostgreSQLデータベースのようなデータソースや、users
やposts
のようなモデル、そしてそれらの間のリレーションを定義します。このスキーマを使用して、PrismaはCreate-Read-Update-Delete(CRUD)APIを公開するクライアントを生成し、これをデータベースのクエリに使用します。このPrismaクライアントは、Node.jsアプリでプレーンなJavaScriptオブジェクトを返し、モデルクラスのインスタンスではない、リッチなクエリビルダーとして機能します。
人気度
Prisma GitHubリポジトリで20.7kのスターを獲得しているPrismaは、Node開発者の間で人気のあるデータベースツールであり、Bookshelf.jsやObjection.jsのような既存のライブラリに匹敵しますが、GitHubスターが25kを超えるSequelizeやTypeORMほど人気はありません。Prismaは2020年6月に本番リリースされたばかりであるのに対し、他のほとんどのツールは数年前から存在していることに注意が必要です。
npmダウンロード数に関しては、考慮された期間に週362kのダウンロードがあり、Bookshelf.jsやObjection.jsなどのツールよりも多いですが、Sequelize、TypeORM、Mongooseと同じレベルにはありません。しかし、この記事で考慮された主要なツールの中で最も高い成長率を示しており、過去6ヶ月でnpmダウンロードが94%増加しています。
評価:人気
リポジトリ活動
PrismaのGitHubリポジトリは、この記事で検討されたすべてのツールの中で最も活発であると言っても過言ではありません。この記事で考慮されたデータ月の間に258コミット、3リリース、101のマージされたPRがあり、Prismaは活発に開発されています。新機能、バグ修正、および更新が頻繁にプッシュされ、新しいバージョンは2週間ごとにリリースされています。
評価:非常に活発
サポート
ここで検討されている他のツールほど長い歴史はありませんが、Prismaは強力で活発な開発者サポートネットワークの恩恵を受けています。ドキュメントはよく整理されており、積極的に拡張されており、非常に詳細です。
質問がある場合は、Prisma Slackチャネルを使用したり、GitHub Discussionsページで質問したり、GitHub Issueを起票したりできます。これらはすべて非常に活発です。StackOverflowには参照できる質問のライブラリほど大規模なものはありませんが、GitHub DiscussionsとRedditで回答されたクエリのライブラリがこれを十分に補っています。
評価:強力
成熟度と安定性
Prismaは2016年に最初に作成およびリリースされ、この記事で検討されている新しいツールの一つです。Graphcool(GraphQLバックエンド・アズ・ア・サービス)として始まり、いくつかの反復と再設計を経てきました。その後、GraphcoolはデータベースとGraphQLツールに転換し、16.9kのGitHubスターを持つ非常に人気のあるプロジェクトであるPrisma 1.0となりました。2020年にベータ版がリリースされたPrisma 2.0は、PrismaサーバーとGraphQLレイヤーの両方をなくし、今日のJavaScriptおよびTypeScript ORMの代替となりました。
Prisma 2.0は、プライベート企業Prismaによって保守、サポート、活発に開発されているオープンソースのJavaScript ORMであり、同社は最近1200万ドルのシリーズA資金調達ラウンドを完了しました。Prismaは、Prismaの維持と構築のために、フルタイムのエンジニア、開発者アドボケイト、テクニカルライターなどを雇用しています。これは、開発者がJavaScriptデータベースインターフェースとしてPrismaを実装する際に、十分なサポートを受けられることを保証します。
評価:比較的新しい
データベースサポート
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は比較的新しいデータベースツールであり、いくつかの反復と再設計を経てきましたが、モデル定義にJavaScriptクラスを使用する一般的なORMとは対照的に、独自のスキーマ中心のアーキテクチャを持っています。資金提供を受けている企業と有給の開発者による支援、活発なサポートコミュニティ、迅速な開発サイクルの恩恵を受けています。これは人気があり、急速に成長している選択肢であり、今後も存在し続けるでしょう。
Prismaが優れた選択肢であると考える理由について詳しく知りたい場合は、当社の「Why Prisma?」ページをご覧ください。
Sequelize
評価概要
- 人気度:非常に人気
- リポジトリ活動:非常に活発
- サポート:平均的
- 成熟度と安定性:非常に成熟
- サポートされているデータベース:MySQL、MariaDB、SQLite、およびMicrosoft SQL Server
概要
Sequelizeは、PostgreSQL、MySQL、MariaDB、SQLite、およびMicrosoft SQL Serverをサポートする、確立された成熟したPromiseベースのNode.js ORMです。Model
クラスを継承してモデルを定義する従来のORMパターンに従います。SELECT
やINSERT
のような操作は、クラスメソッドを使用して実行されます。リレーションもhasMany()
やbelongsTo()
のようなクラスメソッドを使用して定義されます。
人気度
検討期間中、GitHubで25.7kのスターと週135万回のnpmダウンロードを記録したSequelizeは、この記事で検討されている中で最も人気のあるリレーショナルデータベースORMです。過去6ヶ月間でnpmダウンロードが14%増加しており、まだ成長しています。比較として、次に人気のあるリレーショナルデータベースORMはTypeORMで、週918kのnpmダウンロードがあります。(Mongooseも非常に人気がありますが、MongoDBのみをサポートしています。)
評価:非常に人気
リポジトリ活動
検討期間中、Sequelizeの10の新しいバージョンがリリースされ、179のコミットがプッシュされ(すべてのブランチで)、86のPRがマージされました。これは、Sequelizeが非常に活発であることを示しています。
評価:非常に活発
サポート
約10年間存在しているため、StackOverflowやRedditでの検索を通じてSequelizeのサポートを見つけることができるでしょう。そのドキュメントは広範で、数多くの使用例が含まれており、使用パターンに関するより理論的な議論(例えば、その関連付けドキュメント)も含まれています。しかし、SequelizeのGitHub IssuesとSlackチャネルは、多くのクエリが未回答のままであり、改善の余地があります。
評価:平均的
成熟度と安定性
Sequelizeは、利用可能なNode ORMの中で最も成熟したものの1つです。もはや急速に変化するプロジェクトではなく、最近の開発はバグ修正とドキュメントの更新に焦点を当てたメンテナンス中心のようです。これは、メンテナーと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、ウェブブラウザ、Cordovaなど複数のプラットフォームで実行できます。TypeScriptと型サポートを念頭に置いて構築されており、主要なORMアーキテクチャパターンであるデータマッパーとアクティブレコードの両方をサポートし、開発者が2つの間で選択できる柔軟性を提供します。また、クエリビルダーも含まれています。
人気度
2016年のリリース以来、TypeORMは非常に急速に成長し、最も人気のあるJavaScriptおよびTypeScript ORMの1つになりました。GitHubで27.2kのスターと週918kのnpmダウンロード数を持ち、SequelizeやMongooseとともに最も人気のあるORM選択肢の1つです。
評価:非常に人気
リポジトリ活動
TypeORMのGitHubリポジトリは活発です。過去1ヶ月で、74のコミットがプッシュされ(すべてのブランチに)、41のPRがマージされました。厳密なリリーススケジュールはないようで、最新のリリースは2021年11月に行われました。
評価:活発
サポート
TypeORMのドキュメントは良好で、マイグレーション、リレーション、データマッパー、アクティブレコードなどのORMパターンといったデータベースの概念も網羅しています。そこそこ活発なSlackコミュニティがあり、RedditやStackOverflowでの存在感も中程度ですが、GitHub Issuesではあまり助けを得られないかもしれません。
評価:良好
成熟度と安定性
TypeORMはPrismaと成熟度で比較できますが、TypeScript用に構築されたHibernateの影響を受けた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は、最も人気のある2つのリレーショナルデータベースORMです。TypeORMはSequelizeとは異なり、より高い柔軟性を提供し、異なる使用パターンを選択でき、強力なクエリビルダーも含まれています。TypeORMは多くの人気のあるデータベースをサポートしており、プロジェクトはオープンソースの貢献者に完全に依存しているものの、依然として活発です。
PrismaとTypeORMのより詳細な比較については、当社のTypeORM比較ページをご覧ください。
Mongoose
評価概要
- 人気度:非常に人気
- リポジトリ活動:活発
- サポート:良好
- 成熟度と安定性:成熟
- サポートされているデータベース:MongoDB
概要
Mongooseは、MongoDB用の人気があり、よくメンテナンスされているNode.jsのオブジェクトモデリングツールです。厳密に言えば、MongooseはドキュメントベースのデータベースであるMongoDBのため、オブジェクトドキュメントマッパーです。スキーマを使用してデータをモデル化でき、組み込みの型キャスト、バリデーション、クエリビルディング、ビジネスロジックフックが含まれています。
人気度
Mongooseは、MongoDBデータベース用の最も人気のあるJavaScriptデータモデリングツールです。GitHubで23.9kのスターと週190万回のnpmダウンロードを誇ります。
評価:非常に人気
リポジトリ活動
MongooseのGitHubリポジトリはかなり活発です。過去1ヶ月で、複数のブランチにわたって199のコミットがあり、58のPRがマージされました。最近のコミットは、バグ修正、機能追加、ドキュメントに焦点を当てています。リリースはかなり頻繁に行われているようで、検討期間中に5回ありました。
評価:活発
サポート
Mongooseのドキュメントは、クエリ、モデルの作成、バリデーションなど、最も一般的な操作の使用ガイドで構成されています。そのAPIドキュメントには、多くの役立つスニペットも含まれています。SlackとGitterコミュニティがありますが(どちらも比較的静かですが)、RedditとStackOverflowでは多くのサポートとヒントを見つけることができます。GitHub Issuesセクションもかなり活発で、ほとんどの問題がメンテナーまたは他のMongooseユーザーから何らかの応答またはサポートを受けています。
評価:良好
成熟度と安定性
Mongooseは2011年から存在しており、この記事で検討されている中で最も成熟したプロジェクトの1つです。Node.js ODMをMongoDBで使用したい場合、Mongooseのインターフェースが根本的に変更されることはなく、MongoDBのリリースに合わせて最新の状態に保たれることを信頼できます。OpenCollectiveの貢献者から年間6万7千ドルの予算を得ており、印象的な量のオープンソース財政支援を誇っています。一連の買収を通じて、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パターンに触発されており、データをモデル化し操作するためのシンプルなインターフェースを提供します。
人気度
GitHubスターが6.3kのBookshelf.jsは、SequelizeやTypeORMほど人気はありませんが、Objection.jsやWaterline.jsと同じ範囲にあります。週82kのダウンロード数(Sequelizeの135万と比較して)があるということは、広く採用されていないかもしれませんが、そのシンプルなインターフェースを好む開発者のコアな層が依然として存在することを意味します。過去6ヶ月間でnpmダウンロードが36%減少しており、その人気は多少衰えているようです。
評価:人気
リポジトリ活動
過去1ヶ月間、Bookshelfリポジトリにはコミットがなく、リリースもなく、マージされたプルリクエストもありませんでした。メインブランチには約1年間、新しいコミットがありません。執筆時点での最後のリリースは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のような機能を構築しているため、いつでもクエリビルダーに切り替えることができます。
人気度
GitHubで6.5kスター、npmで週に11.5万ダウンロードを記録しており、Objection.jsはBookshelf.jsと人気度で近く、Prismaの次に位置します。これらはいずれも、2.5万以上のスターと週90万以上のダウンロード数を持つSequelizeやTypeORMほど人気はありません。
評価:人気
リポジトリ活動
Objection.jsのリポジトリは、本記事で考慮した期間においてコミットやマージされたPRがありませんでした。Objectionの最後のリリースは2021年12月31日で、いくつかのバグ修正が含まれていました。PrismaやTypeORMのようなプロジェクトほど活発ではありませんが、積極的にメンテナンスされています。
評価: ある程度活発
サポート
Objectionのドキュメントは、モデルとリレーションの作成、クエリ、トランザクション、フック、バリデーションといった主要な機能を網羅した使用ガイドで構成されています。また、APIドキュメントや、JOINやサブクエリといった一般的な操作の例を含む「レシピブック」も用意されています。StackOverflowではあまり多くの助けは見つからないかもしれませんが、プロジェクトのGitterはかなり活発で協力的であり、Redditにもそこそこの存在感があり、メンテナーはGitHub Issuesに頻繁に応答しています。
評価:良好
成熟度と安定性
Objectionは2015年から存在し、成熟したプロジェクトです。財政的または企業的な支援を受けているようには見えず、オープンソースコミュニティによって維持されています。Objection.jsのプロダクションでの使用例のリストについては、以下を参照してください。[本番環境でObjection.jsを使用しているのは?](本番環境でObjection.jsを使用しているのは?)
評価:成熟
データベースサポート
SQLite、PostgreSQL、MySQL
注目すべき機能
- Knex.jsの上に構築
- イーガーローディング
- トランザクションサポート
- JSONスキーマに対するモデルの検証
- クエリフック(挿入前/後、更新など)
- グラフアップサート
- ページング
機能の完全なリストについては、Objection.jsのGitHub READMEを参照してください。
使用例
リレーションクエリ(指定されたユーザーのメールアドレスに基づいて、そのユーザーのすべての投稿を取得)
const user = await User.query().findOne({email: 'alice@objection.js',})const posts = await user.$relatedQuery('posts')
概要
Objection.jsは、Knex.jsクエリビルダーライブラリの上にORMのような機能群を構築している点でBookshelf.jsに最も似ています。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で週に3.7万ダウンロードを記録しています。週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フレームワークの一部として、Y Combinatorスタートアップインキュベーターで育成された非公開のシード資金提供企業であるSails Companyによって管理および維持されています。Sails.jsはVerizon、Postman、JetBlueなどで使用されている人気のあるJavaScriptフレームワークですが、スタンドアロンの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やJOIN、インデックスなどのリレーショナルデータベースの概念に精通していることが求められます。
人気度
GitHubで15.4kスター、npmで週に104万ダウンロードを記録しており、Knex.jsは非常に人気のある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は、通常のJavaScriptもサポートする新しいTypeScript ORMです。主に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からの資金提供(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 Companyが支援 | PostgreSQL、MySQL、MongoDB |
Knex.js | クエリビルダー | 💜💜💜 | 🌳🌳🌳 | 🔵🔵🔵 | 成熟、資金なし | PostgreSQL、MySQL、MariaDB、SQLite、MSSQL、Oracle、Amazon Redshift |
結論
本記事では、最も人気のあるNode.jsのORM、データベースツールキット、クエリビルダーを要約します。オープンソースプロジェクトとしての健全性は、リポジトリへの貢献度や開発者サポートなどの基準に基づいて評価されています。
これはNode.jsデータベースインターフェースを選択するための網羅的なフレームワークを意図したものではなく、パッケージのプログラミングインターフェース、設計、データベース機能のサポート、柔軟性といった他の要因は、ここで評価された基準の多くよりもはるかに重要になる可能性があります。異なるNode.jsプロジェクトには異なるツールが必要となる場合があります。
クエリビルダーとORMについてさらに学ぶには、データベース、データモデリングなどについて学べる無料の役立つ知識ベースであるPrismaのデータガイドから、「SQL、クエリビルダー、ORMの比較」を参照してください。