💪

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