NestJSでPrismaを操作する
Prismaは現在、主に以下のデータベースをサポートしています。
- PostgreSQL
- MySQL
- SQL Server
- SQLite
- MongoDB
PrismaはJavaScriptでも活用できます。しかし、本章ではPrismaの型安全性を最大限に活用するためにTypeScriptを使います。競合のTypeORMとの詳細な性能の比較はこちらの記事で確認できます。
メモ
Prismaの動作をざっくり理解したければ、Quickstartに従うか、公式ドキュメントのはじめにを参照してください。また、公式GitHubの
prisma-examples
リポジトリにはREST APIとGraphQL API両方のサンプルが用意されています。あと、ざっくりでも概要を確認したい人(忙しい方)はこちらの記事を参照してください。(英語ですが)
正式名称からわかるように、オブジェクトとデータベースのマッピングを行うものです。
多くのプログラミング言語はオブジェクトを扱うので、そのオブジェクトをデータベースに保存できるように、対応付けを簡単にするためにORMを活用します。より簡単に言えば、SQLを直接書かずにオブジェクトのメソッドだけでデータベースを操作できるということになります。
また、データベースの作成やマイグレーションなどの操作もORMで実施できます。
本章では、NestJSとPrismaをゼロから始める方法について学習します。データベースのデータを読み書きできるREST APIを持つサンプルNestJSアプリケーションを開発していきます。
本ガイドでは、データベースサーバのセットアップのオーバーヘッドを節約するためにSQLiteを使います。PostgreSQLやMySQLを使用している場合でも、本ガイドに従うことができます。適切な場所に、これらのデータベースを使用するための特別な説明があります。
メモ
すでに既 存のプロジェクトを持っていて、Prismaへの移行を検討している場合は「既存のプロジェクトにPrismaを追加するためのガイド」を参照ください。TypeORMから移行する場合は、「TypeORMからPrismaへ移行するためのガイド」を参照ください。
まずはNestJS CLIをインストールして以下のコマンドを実行します。
npm install -g @nestjs/cli
npx nest new hello-prisma
http://localhost:3000/
で動作する REST API は、現在src/app.controller.ts
に実装されている 1 つのルートを提供しています。このガイドの過程で、ユーザーや投稿に関するデータを保存・取得するためのルートを追加で実装していきます。まずはPrisma CLIを開発用依存ファイルとしてプロジ ェクトにインストールします。
cd hello-prisma
npm install prisma --save-dev
npx prisma
# yarn経由
yarn add prisma --dev
yarn prisma
ここで、Prisma CLIの
init
コマンドを使ってPrismaの初期設定を行います。npx prisma init
このコマンドは、以下のファイルで新しい
prisma
ディレクトリを作成します。schema.prisma
:データベース接 続を指定し、データベーススキーマを格納します。.env
:データベースの認証情報を環境変数のグループに格納する際に使います。
データベース接続は
schema.prisma
ファイルのdatasource
ブロックで設定されます。デフォルトではpostgresql
に設定されていますが、このガイドではSQLiteを使用するので、データソースブロックのプロバイダフィールドをsqlite
に調整する必要があります。ここで、
.env
を開いてDATABASE_URL
環境変数を以下のように調整します。.env
DATABASE_URL="file:./dev.db"
SQLiteは単純なファイルであり、SQLiteを使用するためにサーバーは必要ありません。したがって、ホストとポートを含む接続URLを設定する代わりに、ローカルファイル(この場合
dev.db
と呼ばれる)を指定するだけでよいのです。このファイルは次のステップで作成されます。以下のようにファイルを調整します。
すべて大文字で綴られたプレースホルダーをデータベース認証情報に置き換えます。
SCHEMA
プレースホルダーに何を指定すればいいのかわからない場合は、デフォルトの値であるpublic
を指定することが多いので注意しましょう。DATABASE_URL="postgresql://USER:[email protected]:PORT/DATABASE?schema=public"
以下のようにファイルを調整します。
大文字で書かれたプレースホルダーを、あなたのデータベース認証情報に置き換えましょう。
このセクションでは、Prisma Migrateを使用して、データベースに2つの新しいテーブルを作成します。Prisma Migrateは、Prismaスキーマの宣言型データモデル定義に対応したSQLマイグレーションファイルを生成します。これらの移行ファイルは完全にカスタマイズ可能で、基礎となるデータベースの追加機能を構成したり、シードなどの追加コマンドを含めることができます。
schema.prisma
ファイルに次の 2 つのモデルを追加します。Prismaモデルを配置した状態で、SQLの移行ファイルを生成し、データベースに対して実行することができます。ターミナルで以下のコマンドを実行します。
npx prisma migrate dev --name init
この
prisma migrate dev
コマンドは、SQL ファイルを生成し、データベースに対して直接実行します。今回は、既存のprisma
ディレクトリに以下のようなマイグレーションファイルを作成しました。$ tree prisma
prisma
├── dev.db
├── migrations
│ └── 20201207100915_init
│ └── migration.sql
└── schema.prisma
SQLiteに以下のデータベースが作成されます。
-- CreateTable
CREATE TABLE "User" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"email" TEXT NOT NULL,
"name" TEXT
);
-- CreateTable
CREATE TABLE "Post" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"title" TEXT NOT NULL,
"content" TEXT,
"published" BOOLEAN DEFAULT false,
"authorId" INTEGER,
FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE
);
-- CreateIndex
CREATE UNIQUE INDEX "User.email_unique" ON "User"("email");
Prisma Clientは、Prismaのモデル定義から生成される型安全のデータベースクライアントです。このアプローチにより、Prisma Clientはモデルに特化したCRUD操作を公開することができます。
プロジェクトにPrisma Clientをインストールするには、ターミナルで次のコマンドを実行します。
npm install @prisma/client
インストール時に、Prismaは自動的に
prisma generate
コマンドを呼び出すことに注意してください。今後、Prismaモデルを変更するたびにこのコマンドを実行し、生成されたPrismaクライアントを更新する必要があります。メモ
prisma generate
コマンドはPrismaスキーマを読み込み、node_modules/@prisma/client
内に生成されたPrismaクライアントライブラリを更新します。NestJSアプリケーションをセットアップする際、サービス内のデータベースクエリのために、Prisma Client APIを抽象化したいと思います。まず、
PrismaClient