Getting Started

Panduan Lengkap Mastering Prisma ORM dengan Claude Code

Panduan komprehensif tentang mastering prisma orm menggunakan Claude Code dengan contoh praktis dan best practices.

Prisma ORM

Prisma ORM TypeScript untuk 次世代ORM.type safetyなdatabaseアクセス、直感的なスキーマdefinisi、自動マイグレーション penyediaan.Claude Code dan 組み合わせれば、database設計 dari implementasiま efisien 進められ.

Desain Skema

// prisma/schema.prisma
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id        String   @id @default(cuid())
  email     String   @unique
  name      String
  avatar    String?
  posts     Post[]
  comments  Comment[]
  profile   Profile?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  @@index([email])
}

model Profile {
  id     String  @id @default(cuid())
  bio    String?
  url    String?
  user   User    @relation(fields: [userId], references: [id], onDelete: Cascade)
  userId String  @unique
}

model Post {
  id          String    @id @default(cuid())
  title       String
  content     String
  published   Boolean   @default(false)
  author      User      @relation(fields: [authorId], references: [id])
  authorId    String
  categories  Category[]
  comments    Comment[]
  publishedAt DateTime?
  createdAt   DateTime  @default(now())
  updatedAt   DateTime  @updatedAt

  @@index([authorId])
  @@index([published, publishedAt])
}

model Category {
  id    String @id @default(cuid())
  name  String @unique
  slug  String @unique
  posts Post[]
}

model Comment {
  id        String   @id @default(cuid())
  content   String
  author    User     @relation(fields: [authorId], references: [id])
  authorId  String
  post      Post     @relation(fields: [postId], references: [id], onDelete: Cascade)
  postId    String
  createdAt DateTime @default(now())

  @@index([postId])
}

Operasi CRUD

import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

// pembuatan
async function createPost(data: {
  title: string;
  content: string;
  authorId: string;
  categoryIds: string[];
}) {
  return prisma.post.create({
    data: {
      title: data.title,
      content: data.content,
      author: { connect: { id: data.authorId } },
      categories: {
        connect: data.categoryIds.map((id) => ({ id })),
      },
    },
    include: {
      author: { select: { id: true, name: true } },
      categories: true,
    },
  });
}

// pencarian(pagination付き)
async function getPosts(params: {
  page?: number;
  perPage?: number;
  category?: string;
  search?: string;
}) {
  const { page = 1, perPage = 20, category, search } = params;

  const where = {
    published: true,
    ...(category && {
      categories: { some: { slug: category } },
    }),
    ...(search && {
      OR: [
        { title: { contains: search, mode: "insensitive" as const } },
        { content: { contains: search, mode: "insensitive" as const } },
      ],
    }),
  };

  const [posts, total] = await Promise.all([
    prisma.post.findMany({
      where,
      skip: (page - 1) * perPage,
      take: perPage,
      orderBy: { publishedAt: "desc" },
      include: {
        author: { select: { id: true, name: true, avatar: true } },
        categories: true,
        _count: { select: { comments: true } },
      },
    }),
    prisma.post.count({ where }),
  ]);

  return {
    posts,
    pagination: {
      total,
      page,
      perPage,
      totalPages: Math.ceil(total / perPage),
    },
  };
}

トランザクション

async function publishPost(postId: string) {
  return prisma.$transaction(async (tx) => {
    const post = await tx.post.findUnique({
      where: { id: postId },
    });

    if (!post) throw new Error("Post not found");
    if (post.published) throw new Error("Already published");

    const updated = await tx.post.update({
      where: { id: postId },
      data: {
        published: true,
        publishedAt: new Date(),
      },
    });

    // notifikasi pembuatan
    await tx.notification.create({
      data: {
        type: "POST_PUBLISHED",
        message: `「${post.title}」 publikasiされま`,
        userId: post.authorId,
      },
    });

    return updated;
  });
}

Migrasi

# スキーマ変更後のマイグレーション
npx prisma migrate dev --name add_profile_table

# 本番環境へのデプロイ
npx prisma migrate deploy

# スキーマの同期(開発用)
npx prisma db push

Prompt untuk Pemanfaatan Claude Code

Prisma 使ったpengembangan Claude Code 依頼 例.dasar的な使い方 Claude Code入門panduan、他 ORM dan 比較 Drizzle ORMpemanfaatan法 juga bisa dijadikan referensi.

Prisma dengan ブログ databaseスキーマ 設計して。
- pengguna、artikel、kategori、コメント モデル
- tepatなリレーション dan index
- pagination付き pencarianquery
- トランザクション 使ったpublikasipemrosesan
- マイグレーションfile juga generateして

Prisma 詳細 Prisma公式dokumen silakan lihat.Claude Code pemanfaatan法 公式dokumen konfirmasi bisa dilakukan.

Summary

Prisma ORM type safetyなdatabaseアクセス penyediaanし、pengembangan体験 大幅 向上させ.Claude Code スキーマ設計 dari queryoptimasiま 依頼すれば、robustなデータ層 efisien pembangunan bisa dilakukan.

#Claude Code #Prisma #ORM #database #TypeScript