💪
Prisma 主要機能 & よく使う文法まとめ
Prisma は、TypeScript を基盤とした ORM(Object Relational Mapperです。
データベースを直接操作するためのSQLクエリを自分で書かなくても、TypeScript のコードで直感的かつ安全にデータを扱うことができます。
① モデル定義(schema.prisma)
DB の構造(テーブル、フィールド、リレーションなど)を定義します。
model User {
id String @id @default(cuid())
email String @unique
name String?
createdAt DateTime @default(now())
posts Post[] // 1対多
}
model Post {
id String @id @default(cuid())
title String
content String?
user User @relation(fields: [userId], references: [id])
userId String
createdAt DateTime @default(now())
}
② データ作成(CREATE)
const newUser = await prisma.user.create({
data: {
email: "hyoni@example.com",
name: "ヒョニ",
},
});
③ データ取得(READ)
✅ 全件取得
const users = await prisma.user.findMany();
✅ 条件付き取得
const user = await prisma.user.findUnique({
where: { email: "hyoni@example.com" },
});
✅ 特定フィールドのみ取得
const user = await prisma.user.findFirst({
select: { id: true, name: true },
where: { name: { contains: "ヒョ" } },
});
✅ リレーションを含めて取得
const users = await prisma.user.findMany({
include: { posts: true },
});
④ データ更新(UPDATE)
const updatedUser = await prisma.user.update({
where: { id: "ckl..." },
data: { name: "新しい名前" },
});
⑤ データ削除(DELETE)
await prisma.user.delete({
where: { id: "ckl..." },
});
⑥ 存在すれば更新・なければ作成(upsert)
データがすでに存在する場合は更新し、存在しない場合は新規作成。
await prisma.user.upsert({
where: { email: "hyoni@example.com" }, // 存在チェック条件(@id または @unique フィールド)
update: { name: "ヒョニ更新" }, // 存在する場合 → 更新
create: { // 存在しない場合 → 新規作成
email: "hyoni@example.com",
name: "ヒョニ作成",
},
});
⑦ リレーション操作(Relation 操作)
✅ 1:N 同時作成
const user = await prisma.user.create({
data: {
name: "ヒョニ",
posts: {
create: [
{ title: "最初の投稿" },
{ title: "2つ目の投稿" },
],
},
},
});
✅ 既存データを接続(connect)
await prisma.post.update({
where: { id: "post123" },
data: { user: { connect: { id: "user123" } } },
});
✅ 関係を解除(disconnect)
await prisma.post.update({
where: { id: "post123" },
data: { user: { disconnect: true } },
});
⑧ 条件検索(where句の書き方)
演算子 | 説明 | 例 |
---|---|---|
equals |
完全一致 | { age: { equals: 20 } } |
contains |
部分一致 | { name: { contains: "ヒョ" } } |
in |
複数一致 | { id: { in: ["a", "b"] } } |
gte / lte
|
以上 / 以下 | { age: { gte: 18 } } |
AND , OR , NOT
|
複合条件 | { OR: [{ name: "ヒョニ" }, { name: "Hyoni" }] } |
⑨ トランザクション(Transaction)
複数のクエリを「ひとまとめ」にして処理。
どれか1つでも失敗したら全体をロールバックします。
await prisma.$transaction(async (tx) => {
const user = await tx.user.create({ data: { name: "ヒョニ" } });
await tx.post.create({ data: { title: "初投稿", userId: user.id } });
});
⑩ Raw Query(直接 SQL を実行)
ORM でも必要に応じて SQL を直接書けます。
(※基本は使わないが、複雑なケースでは便利)
const result = await prisma.$queryRaw`
SELECT * FROM "User" WHERE email = ${email}
`;
⑪ Migration(マイグレーション)
スキーマ変更を DB に反映するコマンド。
npx prisma migrate dev --name add_user_table
Prisma が変更を検知して
→ SQL 自動生成 → DB へ適用 → バージョン管理。
その他の便利機能
記法 | 内容 |
---|---|
@@unique([a,b]) |
複合ユニーク制約 |
@@index([email]) |
インデックス作成 |
@default(uuid()) |
UUID 自動生成 |
@map("table_name") |
DB のテーブル名を手動指定 |
@@schema("public") |
スキーマ指定(PostgreSQL などで使用) |
まとめ
カテゴリ | 主なメソッド | 主な用途 |
---|---|---|
CRUD |
create , findMany , update , delete
|
基本的なデータ操作 |
条件検索 |
where , select , include
|
フィルタリング / 関連取得 |
関係操作 |
connect , create , disconnect
|
1:N / N:M 関係処理 |
トランザクション | $transaction |
まとめ処理 |
Raw SQL | $queryRaw |
直接 SQL を実行 |
マイグレーション | prisma migrate |
DB バージョン管理 |
Discussion