在 Manus 中运行任何 Skill
一键导入
一键导入
一键在 Manus 中运行任何 Skill
开始使用prisma-patterns
星标2
分支0
更新时间2026年4月17日 01:09
Prisma 스키마, 쿼리, 관계, 마이그레이션 패턴.
安装
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
SKILL.md
readonly菜单
Prisma 스키마, 쿼리, 관계, 마이그레이션 패턴.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Figma MCP 로 디자인을 픽셀 퍼펙트로 구현. 토큰 추출 → 테마 매핑 → 정확한 레이아웃 → 스크린샷 diff 검증 루프. Flutter/React 공용.
Flutter 외부/BaaS API 연동 풀 파이프라인. 계약 → retrofit 코드젠 → dio 인터셉터(auth/retry) → Result 매핑 → repository → 오프라인 캐시. dio-retrofit 스킬 심화.
TanStack Query v5 패턴 (React). 서버 상태 패칭/캐시/뮤테이션/낙관적 업데이트.
Supabase BaaS 연동 패턴 (Flutter). 인증/DB/리얼타임/스토리지/RLS.
Auth.js v5 (NextAuth) 패턴. 세션/미들웨어/Server Action 가드.
Cross-stack API 계약 동기화. NestJS DTO ↔ Flutter DTO 일치성 관리.
| name | prisma-patterns |
| description | Prisma 스키마, 쿼리, 관계, 마이그레이션 패턴. |
| globs | prisma/**, server/prisma/**, server/src/**/prisma/** |
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
// 모든 모델 공통 필드
model User {
id String @id @default(cuid())
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
// 필드
nickname String
email String? @unique
provider AuthProvider
providerId String @map("provider_id")
// 관계
boardParticipants BoardParticipant[]
pointTransactions PointTransaction[]
// 복합 유니크
@@unique([provider, providerId])
// 인덱스
@@index([email])
// DB 테이블명 매핑
@@map("users")
}
enum AuthProvider {
KAKAO
NAVER
APPLE
}
// 1:N 관계
model Board {
id String @id @default(cuid())
name String
tiles BoardTile[] // 1:N
@@map("boards")
}
model BoardTile {
id String @id @default(cuid())
boardId String @map("board_id")
board Board @relation(fields: [boardId], references: [id], onDelete: Cascade)
position Int
// 자기 참조 (워프 대상)
warpTargetId String? @map("warp_target_id")
warpTarget BoardTile? @relation("WarpLink", fields: [warpTargetId], references: [id])
warpedFrom BoardTile? @relation("WarpLink")
@@unique([boardId, position])
@@map("board_tiles")
}
// M:N 관계 (명시적 조인 테이블)
model BoardParticipant {
id String @id @default(cuid())
boardId String @map("board_id")
board Board @relation(fields: [boardId], references: [id])
participantId String @map("participant_id")
user User? @relation(fields: [participantId], references: [id])
participantType ParticipantType
currentPosition Int @default(0) @map("current_position")
lapCount Int @default(0) @map("lap_count")
@@unique([boardId, participantId])
@@map("board_participants")
}
// Select: 필요한 필드만
const users = await prisma.user.findMany({
select: {
id: true,
nickname: true,
_count: { select: { pointTransactions: true } },
},
take: 20,
skip: page * 20,
orderBy: { createdAt: 'desc' },
});
// Include: 관계 로딩 (N+1 방지)
const board = await prisma.board.findUnique({
where: { id: boardId },
include: {
tiles: {
orderBy: { position: 'asc' },
include: {
building: true,
},
},
},
});
// Aggregate
const stats = await prisma.pointTransaction.aggregate({
where: { userId, type: 'FAUCET' },
_sum: { amount: true },
_count: true,
});
// GroupBy
const dailyStats = await prisma.pointTransaction.groupBy({
by: ['source'],
where: { createdAt: { gte: startOfDay } },
_sum: { amount: true },
_count: true,
});
// Interactive Transaction (권장)
const result = await prisma.$transaction(async (tx) => {
const user = await tx.user.findUniqueOrThrow({ where: { id: userId } });
// 포인트 차감
await tx.pointTransaction.create({
data: { userId, amount: -price, type: 'BURN', source: 'LAND_PURCHASE' },
});
// 땅 구매
const tile = await tx.boardTile.update({
where: { id: tileId },
data: { ownerId: userId, ownerType: 'USER' },
});
return tile;
}, {
isolationLevel: 'Serializable', // 동시성 제어 필요 시
timeout: 10000,
});
# 개발: 스키마 변경 → 마이그레이션 생성 + 적용
npx prisma migrate dev --name add_building_level
# 프로덕션: 마이그레이션 적용만
npx prisma migrate deploy
# 클라이언트 재생성 (스키마 변경 후)
npx prisma generate
# DB 리셋 (개발용 - 주의)
npx prisma migrate reset
# DB 시드
npx prisma db seed
@@map)@map)@id @default(cuid()) 기본createdAt + updatedAt 필수@relation (name, fields, references)@@index 쿼리 패턴에 맞춰 생성onDelete 명시 (Cascade / SetNull / Restrict)deleteMany without where 금지