Prismaで始めよう:Node.jsのためのベストなORM
Emily Parker
Product Engineer · Leapcell

Prismaチュートリアル:KoaとPGに基づく実践的な演習
前書き
Prismaは、TypeScriptに基づいて開発された次世代のORM(Object Relational Mapping)ツールと見なされており、強力な型安全を提供します。この記事では、Koa.jsを使用してシンプルなWebサービスを構築し、それをMySQLデータベースと組み合わせて、Prismaを通じてデータの作成、読み取り、更新、および削除(CRUD)操作を実装する方法を示します。
Prismaの概要
Prismaは、次世代のORMツールであると主張しています。Prismaはオープンソースのデータベースツールチェーンプロジェクトであり、その機能は単なるシンプルなORMをはるかに超えています。PostgreSQL、MySQL、MongoDB、SQL Server、SQLiteなど、複数のデータベースをサポートしています。この記事では、MySQLを例としてデモンストレーションを行います。
Prismaを初めて使用する場合、プロセスは比較的煩雑であり、大まかに次の手順に分けることができます。
- 依存関係をインストールする
- Prismaプロジェクトを初期化する
- Prismaスキーマを設計する(データベース情報とモデルを定義する)
- データベースと同期する
- Prisma Clientを生成する
- Prisma Clientを使用してCRUD操作を完了する
次に、まず開発環境をセットアップし、Prismaについて深く紹介します。
環境の初期化
Koa Webサービスの構築
まず、プロジェクトディレクトリを作成し、依存関係をインストールします。
mkdir koa-prisma cd koa-prisma pnpm init # Koaの依存関係をインストールする pnpm add koa @koa/router koa-bodyparser
中でも、@koa/router
はルーティングミドルウェアであり、ルーティング機能を統合するのに便利です。koa-bodyparser
は、リクエスト本文データを解析し、ctx.request.body
オブジェクトに格納するために使用されます。
次に、新しいindex.js
ファイルを作成し、シンプルなWebサービスを構築します。
const Koa = require('koa') const Router = require('@koa/router') const bodyParser = require('koa-bodyparser') const app = new Koa() // ルーターをインスタンス化し、共通のルートプレフィックスを/usersに設定します const router = new Router({ prefix: '/users' }) app.use(bodyParser()) // ユーザーリストをクエリする router.get('/', async ctx => { }) // 単一のユーザーをクエリする router.get('/:id', async ctx => { }) // ユーザーを作成する router.post('/', async ctx => { }) // ユーザーを更新する router.patch('/:id', async ctx => { }) // ユーザーを削除する router.delete('/:id', async ctx => { }) // ルーティングミドルウェアを登録する app.use(router.routes()).use(router.allowedMethods()) app.listen(3000, () => { console.log('The server is running on port 3000') })
上記のコードは、クエリ、挿入、更新、および削除のデータベース操作に対応する5つのルーティングメソッドを定義しています。Prismaの初期化を完了し、後でPrisma Clientを導入した後、これらのインターフェイスを実装できます。
nodemon
コマンドを使用してサービスを開始します。このモジュールはグローバルにインストールすることをお勧めします。
nodemon src/index.js
Prisma CLI
Prismaの依存関係をインストールする
まず、Prismaの2つの依存関係モジュールをインストールします。
pnpm add -D prisma pnpm add @prisma/client
中でも、prisma
は、データベースの移行、Prisma Clientの作成など、Prismaのさまざまな関数を呼び出すために使用されるCLIコマンドです。次のコマンドを実行して、prisma
の使用方法を表示します。
npx prisma --help
prisma
は7つのコマンドを提供します。
コマンド | 説明 |
---|---|
init | アプリケーションでPrismaを初期化します |
generate | 主にPrisma Clientを生成するために使用されます |
db | データベースのスキーマとライフサイクルを管理します |
migrate | データベースを移行します |
studio | データを管理するためのWebベースのワークベンチを開始します |
validate | Prismaスキーマファイルの構文が正しいかどうかを確認します |
format | Prismaスキーマファイルをフォーマットします。デフォルトではprisma/schema.prisma です |
この記事では、これらのコマンドのうち3つを主に使用します。残りのコマンドは自分で調べてください。
Prismaの初期化
次のコマンドを実行して、初期化を完了します。
npx prisma init
このコマンドは、現在のディレクトリに.env
ファイルとprisma
ディレクトリを作成し、prisma
ディレクトリにschema.prisma
ファイルを作成します。
.env
ファイルは、環境変数を格納するために使用され、通常、いくつかの構成情報が含まれています。prisma
ディレクトリは、Prismaに関連するファイルを格納するために使用されます。現在、schema.prisma
ファイルのみがあります。このファイルはPrismaスキーマファイルであり、データベース接続情報とモデルを定義するために使用されます。
Prismaスキーマの設計
VSCプラグインのインストール
スキーマファイルを編集する前に、VS CodeにPrismaプラグインをインストールすることをお勧めします。このプラグインは、コードの強調表示、フォーマット、オートコンプリート、定義へのジャンプ、.prisma
ファイルのチェックなどの機能を提供し、開発エクスペリエンスを大幅に向上させます。
ジェネレーターの設定
generate
を使用してジェネレーターを定義し、provider
プロパティを介してprisma-client-js
として宣言します(現在、これのみがサポートされています)。prisma generate
コマンドが実行されると、Prisma Clientが生成され、データのCRUD操作を完了するために使用されます。
generator client { provider = "prisma-client-js" }
データソースの設定
datasource
を使用してデータソースを定義し、Prismaがデータベースに接続するために必要な情報を設定します。provider
は、接続されているデータベースのタイプを指定します。デフォルトではpostgresql
です。これをmysql
に変更します。url
は、データベースURLを指定します。構成を分離するために、通常は.env
ファイルで定義され、env()
関数を介して読み取られます。
datasource db { provider = "mysql" url = env("DATABASE_URL") }
デフォルトの.env
ファイルのデータベース接続は、Postgresql用です。
DATABASE_URL=postgresql://johndoe:mypassword@localhost:5432/mydb?schema=public
MySQLデータベース接続URLは、次の必須項目で構成されています。
名前 | プレースホルダー | 説明 |
---|---|---|
ホスト | HOST | データベースのIPまたはドメイン名(localhostなど) |
ポート | PORT | データベースポート(3306など) |
ユーザー | USER | データベースのユーザー名(rootなど) |
パスワード | PASSWORD | データベースのパスワード |
データベース | DATABASE | データベース名(mydbなど) |
上記規則に従って、MySQL URLを定義します。
DATABASE_URL="postgresql://leapcell:leapcell123@localhost:9006/prisma"
ユーザーモデルの定義
ORMツールとして、Prismaのモデルには次の機能があります。
- アプリケーションドメインのエンティティを形成する
- データベースのテーブル(PostgreSQLなどのリレーショナルデータベース)またはコレクション(MongoDB)にマッピングする
- Prisma Client APIのクエリの基礎を形成する
- TypeScriptでは、Prisma Clientはモデルとそのバリアントの型定義を提供し、データベースアクセスの型安全を保証する
モデルを定義する場合、Prismaの組み込みユーティリティ関数(@id()
や@default()
など)が使用されます。たとえば、@id()
は主キーを宣言するために使用され、@default()
はデフォルト値を設定するために使用されます。以下は、ユーザーモデルの定義です。
model User { id Int @id @default(autoincrement()) name String email String @unique password String createdTime DateTime @default(now()) @map("created_time") updatedTime DateTime @updatedAt @map("updated_time") @@map("user") }
次の点に注意する必要があります。
- モデル名は、作成されたデータテーブルの名前のデフォルトです。ここでは、モデル名は
User
であり、`@@map(