はじめに
Node.js / TypeScriptでバックエンド開発を行う際、
データベース操作の実装方法に悩むことがあると思います。
例えば以下のような課題があります。
- SQLを書くのが大変
- 型安全にデータ操作を行いたい
- DB構造とアプリケーションコードの整合性を保ちたい
これらを解決する手段の一つが ORM(Object Relational Mapping) です。
その中でも近年よく利用されているORMが
Prisma ORM です。
Prismaは TypeScriptとの親和性が高く、型安全なデータベース操作ができるORM として広く利用されています。
この記事では、Prismaの基本構造と基本操作について整理します。
Prismaとは
Prismaは Node.js / TypeScript向けのORM です。
ORM(Object Relational Mapping)は
アプリケーションのオブジェクトとリレーショナルデータベースのテーブルを対応付けて操作する仕組み
を指します。
例えば通常のSQLでは
SELECT * FROM users;
と書くデータ取得処理を
Prismaでは次のように書くことができます。
const users = await prisma.user.findMany();
このように TypeScriptからデータベース操作を行うことが可能になります。
なおPrismaでは $queryRaw を使用することで
SQLを直接実行することも可能です。
Prismaの全体構造
簡単に整理すると
TypeScriptコード
↓
Prisma Client
↓
Query Engine
↓
Database
という流れでデータベース操作が行われることになります。
Prismaの主要コンポーネント
Prismaは主に以下の要素で構成されています。
| コンポーネント | 役割 |
|---|---|
| schema.prisma | データモデル定義 |
| Prisma Client | 型安全なDB操作API |
| Prisma Migrate | DBスキーマ変更管理 |
schema.prisma
Prismaでは schema.prisma にデータモデルを定義します。
例:
model User {
id Int @id @default(autoincrement())
name String
email String @unique
}
このファイルでは
データモデル
リレーション
データベース接続設定
などを定義します。
Prisma Client生成
スキーマを定義した後、以下のコマンドを実行します。
npx prisma generate
これにより Prisma Client が生成されます。
Prisma Clientは
型安全なデータベースクエリを提供するライブラリです。
CRUD操作
Prisma Clientでは基本的なCRUD操作を簡潔に記述できます。
データ取得
const users = await prisma.user.findMany();
条件検索
const user = await prisma.user.findFirst({
where: {
email: "test@example.com"
}
});
データ作成
await prisma.user.create({
data: {
name: "Taro",
email: "taro@example.com"
}
});
データ更新
await prisma.user.update({
where: { id: 1 },
data: { name: "Jiro" }
});
データ削除
await prisma.user.delete({
where: { id: 1 }
});
select と include の違い
Prismaでは取得するデータの範囲を制御するため
select と include を使用できます。
select
取得するフィールドを指定します。
const users = await prisma.user.findMany({
select: {
name: true,
email: true
}
});
include
リレーションデータを含めて取得します。
const users = await prisma.user.findMany({
include: {
posts: true
}
});
※同一階層では select と include を同時に指定することはできません。
ただしネストしたリレーションでは組み合わせて使用することが可能です。
初学者がハマりやすいポイント
Prismaを学習する中で、いくつか注意点がありました。
schema変更後はgenerateが必要
schema.prisma を変更した場合
npx prisma generate
を実行しないとPrisma Clientに反映されません。
DB操作は非同期処理
Prisma Clientは非同期処理のため
await prisma.user.findMany()
のように awaitを付ける必要があります。
Prismaのメリット
型安全なクエリ
Prisma Clientはスキーマから型を生成するため
存在しないカラムを指定すると コンパイル時にエラーになります。
可読性が高い
SQLを書く場合と比較して
オブジェクト操作に近い形でクエリを書くことができます。
スキーマ中心の設計
schema.prisma を中心に
- DB構造
- リレーション
- マイグレーション
を管理できるため
アプリケーションとデータベースの整合性を保ちやすくなります。
まとめ
Prismaは
- TypeScriptと相性の良いORM
- 型安全なDB操作が可能
- スキーマ中心の設計
という特徴を持っています。
Node.js / TypeScript環境でバックエンド開発を行う場合
有力な選択肢の一つだと感じました。
おわりに
Prismaを学習する中で、型安全なDB操作の便利さを実感しました。
まだ理解が浅い部分もあるため
もし認識が間違っている点や補足などあれば
コメントで教えていただけると嬉しいです。
