
åŸã§çŽããäžçªé«ãã€ãã Prisma ã®è©±
ã ä»ã®ã¹ããŒãã 1 幎åŸãèªããŸãã ã
æ¬çªããŒã¿ã 1 äžä»¶ãè¶ ããé ãã¹ããŒããå€ããããšããŠæãæ¢ãŸã£ãã
String ã§å®çŸ©ããŠããã¹ããŒã¿ã¹ã«ã©ã ã Enum ã«å€ãããã
nullable ã«ããŠããã«ã©ã ã NOT NULL ã«å¶çŽãããã
1 察 1 ã§èšèšããŠãããªã¬ãŒã·ã§ã³ãã1 察 N ã«å€ãããã
ã©ãããã¡ãã£ãšããä¿®æ£ãã®ã¯ãã ã£ãã
å®éã«ã¯ããã€ã°ã¬ãŒã·ã§ã³ãã¡ã€ã«ãå£ããæ¢åããŒã¿ã®å€æãå¿
èŠã«ãªããã¢ããªã±ãŒã·ã§ã³ã³ãŒãã®ä¿®æ£ãé£éãããã¹ããå
šæ»
ããã
åŸã§çŽãã°ãããšæã£ãŠããèšèšããåŸã«ãªã£ãŠæãé«ãã€ã
ââããããPrisma ã䜿ãç¶ããŠåãåŠãã æå€§ã®æèšã§ããã
ã¹ããŒãã¯åŸã§çŽãããšããé¯èŠ
Prisma ã®ã¹ããŒãå®çŸ©ã¯ãé©ãã»ã©æžããããã
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
createdAt DateTime @default(now())
}ãã®æ°è¡ãæžãã ãã§ãåå®å
šãªã¯ã©ã€ã¢ã³ããçæãããã
ã¢ãã«ãå€ããããã° schema.prisma ãç·šéã㊠prisma migrate dev ãå®è¡ããã
ãŸãã§ã³ãŒããæžãçŽãããã«ãã¹ããŒããçŽããæèŠããããŸãã
ããã«çœ ãããã
éçºåæãããŒã¿ãæ°åä»¶ã®ãã¡ã¯ç¢ºãã«çŽããã
ããããæ¬çªã§æ°åä»¶ã»æ°äžä»¶ã«ãªã£ããšããã¹ããŒãã®å€æŽã¯åãªãã³ãŒãã®ç·šéã§ã¯ãªããªããŸãã
ð æ¢åããŒã¿ã®å€æãå¿
èŠã«ãªã
ãïŒäŸ: String â Enum ãžã®å€æã¯å
šã¬ã³ãŒãã«åœ±é¿ããïŒ
ð NOT NULL å¶çŽã®è¿œå ã¯ãæ¢åããŒã¿ã NULL ã§ããå Žåã«ãã€ã°ã¬ãŒã·ã§ã³ã倱æãã
ð ãªã¬ãŒã·ã§ã³æ§é ã®å€æŽã¯ãå€éšããŒå¶çŽãšæ¢åã¬ã³ãŒãã®æŽåæ§ãåããã
åŸã§çŽããšãã倿ãäžãããšãããã®ã³ã¹ããæ£ç¢ºã«èŠç©ãããŠããéçºè
ã¯å€ããããŸããã
å°ãªããšãã以åã®åã«ã¯ç¡çã§ããã
åŸã§ã®ã³ã¹ããèŠãã«ããçç±
ãªãæåã®èšèšãçããªãã®ãã
çç±ã¯ 3 ã€ãããšæã£ãŠããŸãã
ãçç± 1ã ãåãããšãæ£ããããæ··åãã
å人éçºã§ã¯ãåããç¬éã«å®æãããšæããããã
ã¹ããŒããåå®å
šã«çæãããCRUD ãåäœããã°ãèšèšã®è¯ãæªãã¯åãããŸããã
String ã§å®çŸ©ããã¹ããŒã¿ã¹ãæ£ãããã©ãã
ââåäœç¢ºèªã§ã¯å€æã§ããªãã®ã§ãã
ãçç± 2ã 倿Žã³ã¹ããæªæ¥ã®èªåã«æŒãã€ãããã
ã¹ããŒãèšèšã®åé¡ã¯ãæžãããã®æ¥ã«ã¯çŸããŸããã
3 ã¶æåŸã6 ã¶æåŸãããŒã¿ãå¢ããæ®µéã§è¡šé¢åããŸãã
åé¡ãåºããšããå€ãã®å Žåã¯ç· ãåããè¿ãããããã¯å¥ã®æ©èœéçºã§å¿ããã
ææªã®ã¿ã€ãã³ã°ã§æãã³ã¹ãã®é«ãä¿®æ£ãè¿«ãããŸãã
ãçç± 3ã Prisma ã®æžããããããªã¹ã¯ãé ã
Prisma ã®ã¹ããŒãå®çŸ©ã¯ãæ¬åœã«ããã§ããŠããã
ã·ã³ãã«ã§çŽæçã§ãæžãããšãžã®ããŒãã«ãäœãã
ãã®æžããããããæ°è»œã«æžãå§ããããããšããæèŠãçã¿ããèšèšãæ·±ãèããåã«æžããŠããŸãããšããè¡åã«ã€ãªãããŸãã
å®éã«é«ãã€ããèšèšãã¹ 3 éž
åãå®éã«çµéšãããåŸã§çŽãã³ã¹ããé«ãã£ãèšèšãã¹ã 3 ã€æããŸãã
ããã¹ 1ã ã¹ããŒã¿ã¹ã String ã§å®çŸ©ãã
model Order {
id Int @id @default(autoincrement())
status String // "pending" | "shipped" | "delivered" | "cancelled"
}äžèŠåé¡ãªãããã«èŠããŸãã
ããããã¢ããªã±ãŒã·ã§ã³ã³ãŒãã®ãã¡ãã¡ã« if (status === "shipped") ãæ£ãã°ãå§ããæ®µéã§ãã¿ã€ããå€ã®äžäžèŽãèµ·ãå§ããŸãã
Enum ã«ããã°é²ããåé¡ã§ããã
enum OrderStatus {
PENDING
SHIPPED
DELIVERED
CANCELLED
}
model Order {
id Int @id @default(autoincrement())
status OrderStatus @default(PENDING)
}åŸãããã®å€æãè¡ã£ããšããæ¢åã® String ããŒã¿ããã¹ãŠ Enum å€ã«ãããã³ã°ãããã€ã°ã¬ãŒã·ã§ã³ãå¿ èŠã«ãªããæ°æéãèŠããŸããã
ããã¹ 2ã nullable ã®èšèšãçãã£ã
model User {
id Int @id @default(autoincrement())
address String? // åŸã§å¿
é ã«ãããã NULL ãæ£åš
}åæã¯ãäœæã¯ä»»æå
¥åããšå€æã㊠nullable ã«ããŠããŸããã
åŸãããäœæã¯å¿
é ã«ãããããšããèŠä»¶ãå ãã£ããšããæ¢åã®å
šã¬ã³ãŒãã«ä»®ããŒã¿ãå
¥ããŠãã NOT NULL ã«å€æŽããäœæ¥ãçºçããŸããã
nullable ã«ãããã©ããã¯ãããžãã¹ããžãã¯ã®æ·±ãçè§£ãå¿
èŠã§ãã
ãåŸã§èããããã§å®çŸ©ãã nullable ã¯ãã»ãŒå¿
ãåŸæããŸãã
ããã¹ 3ã 1 察 1 ã®ãªã¬ãŒã·ã§ã³ãåŸãã 1 察 N ã«å€ãã
// æåã®èšèš
model User {
id Int @id @default(autoincrement())
profile Profile?
}
model Profile {
id Int @id @default(autoincrement())
userId Int @unique // 1 察 1
user User @relation(fields: [userId], references: [id])
bio String?
}ããããã£ãŒã«ã¯ 1 人 1 ã€ããšããåœåã®èŠä»¶ãå€ããããè€æ°ã®ãããã£ãŒã«ïŒäŸ: äŒæ¥ã¢ã«ãŠã³ãã®è€æ°æ åœè ïŒãã«æ¡åŒµããå¿ èŠãçããŸããã
@unique ãå€ã㊠1 察 N ã«å€æŽããäœæ¥ã¯ãå€éšããŒå¶çŽã»æ¢åããŒã¿ã®æŽåæ§ç¢ºèªã»ã¢ããªã±ãŒã·ã§ã³ã³ãŒãå šäœã®ä¿®æ£ã䌎ããäžž 1 æ¥ããããŸããã
ã¹ããŒããæžãåã«åã 5 ã€ã®ãã§ãã¯ãªã¹ã
çµéšããäœãäžãããã¹ããŒããæ¬çªã«åºãåã«å¿ ã確èªãã 5 ã€ã®åãã§ãã
ããã§ã㯠1ã ãã®ã«ã©ã 㯠String ã®ãŸãŸã§ããã
å€ãæéã®éžæè¢ã§ããã°ãEnum ã䜿ããŸãã
äŸ: status, role, type, category â Enum åè£
äŸ: name, email, description â String ã®ãŸãŸ
å€æåºæº:
ããã®ã«ã©ã ã®å€ã«ãä»åŸæ°ããéžæè¢ã远å ãããå¯èœæ§ã¯ãããã
ãããªã Enum ãåè£ã
远å ãããéžæè¢ãã³ãŒãäžã§ç®¡çã§ããŸãã
ããã§ã㯠2ã ãã®ã«ã©ã ã¯æ¬åœã« nullable ã§ããã
nullableïŒ?ïŒ ãå®çŸ©ããåã«ããã®åããå¿ ãç«ãŠãŸãã
ããã®ã«ã©ã ã NULL ã®ãšããã¢ããªã±ãŒã·ã§ã³ã¯ã©ãåãã¹ããã
æç¢ºã«çããããªããªããNOT NULL ã®æ¹ãå®å
šã§ãã
åŸãã NOT NULL ã«å€ãããããæåãã NOT NULL ã®æ¹ãã³ã¹ãã¯äœãã
nullable ã«ããã®ã¯ãããžãã¹äžã®çç±ã§ç©ºã蚱容ããããšæç¢ºã«æ±ºæãããšãã ãã§ãã
ããã§ã㯠3ã ãã®ãªã¬ãŒã·ã§ã³ã¯å°æ¥ 1 察 N ã«ãªãå¯èœæ§ã¯ãªãã
1 察 1 ã§èšèšãããªã¬ãŒã·ã§ã³ã¯ãåŸãã 1 察 N ã«å€ããã®ãæãé«ã³ã¹ããªå€æŽã®äžã€ã§ãã
èšèšæã«èªåããŸã:
ããã®ã¢ãã«ã«ã1 ã€ã®ãšã³ãã£ãã£ãè€æ°ã®ã¬ã³ãŒããæã€ã·ããªãªã¯ãããã
ãçŸæç¹ã§ã¯ 1 ã€ã ããå°æ¥çã«è€æ°ã«ãªãå¯èœæ§ãããããšå°ãã§ãæããããæåãã 1 察 N ã§èšèšããŸãã
空ã®é
åïŒã¬ã³ãŒã 0 ä»¶ïŒãæã€ 1 察 N ã¯åé¡ãããŸãããã1 察 1 ã 1 察 N ã«å€ããã®ã¯ç Žå£ç倿Žã«ãªããŸãã
ããã§ã㯠4ã createdAt ãš updatedAt ã¯ãã¹ãŠã®ã¢ãã«ã«å ¥ããã
model Post {
id Int @id @default(autoincrement())
title String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt // â ãããå¿ããã¡
}updatedAt ãåŸãã远å ããå Žåãæ¢åã¬ã³ãŒãã«ããã©ã«ãå€ãå
¥ããå¿
èŠããããŸãã
ããã°ãåããªãããæŽæ°æ¥æã§ãœãŒãã§ããªãããšããèŠæã¯ãåŸããå¿
ãæ¥ãŸãã
æåããå
šã¢ãã«ã«å
¥ããŠãããŸãã
ããã§ã㯠5ã ãœããããªãŒããå¿ èŠãªã¢ãã«ãç¹å®ããŠããã
model User {
id Int @id @default(autoincrement())
email String @unique
deletedAt DateTime? // ãœããããªãŒãçšã«ã©ã
}ãŠãŒã¶ãŒããŒã¿ã泚æããŒã¿ãã³ã³ãã³ãããŒã¿ãªã©ââåé€ãå¿ èŠãªã¢ãã«ã«å¯ŸããŠãç©çåé€ïŒã¬ã³ãŒãã®å®å šåé€ïŒããœããããªãŒãïŒdeletedAt ãèšé²ããŠè«çåé€ïŒãããæåã«æ±ºããŸãã
åŸãããåé€ãããŠãŒã¶ãŒã®æ³šæå±¥æŽãæ¶ããŠããŸã£ãããšããåé¡ãåºãŠãã倿Žããã®ã¯ãå€éšããŒå¶çŽã絡ãæãè€éãªå€æŽã®äžã€ã§ãã
ã¹ããŒããåºãåã®å®è·µã¬ãã¥ãŒæé
ãã§ãã¯ãªã¹ãã確èªããæé ã¯ãã·ã³ãã«ã« 3 ã¹ãããã§ãã
ãã¹ããã 1ã schema.prisma ãéãã§èªã
ã³ãŒããæžããŠãããšãã¯çްéšã«éäžããŠããŸãã
äžåºŠæžãçµããããå
šäœã俯ç°ã§èªãæéã 15 åã ãäœããŸãã
ããã®ã¢ãã«ã¯ 6 ã¶æåŸãåãæ§é ã§ãããããïŒããšããåããæã¡ãªããèªãã
ãã¹ããã 2ã åã¢ãã«ã« 5 ã€ã®ãã§ãã¯ãåœãŠã¯ãã
äžè¿°ã® 5 ã€ã®ãã§ãã¯ãªã¹ãããåã¢ãã«ã«é çªã«åœãŠã¯ããŸãã
## ã¹ããŒãã¬ãã¥ãŒãã§ãã¯ãªã¹ã
### [ã¢ãã«å]
- [ ] String ã«ã©ã ã« Enum åè£ããªãã
- [ ] nullable ã®æ ¹æ ã¯æç¢ºã
- [ ] ãªã¬ãŒã·ã§ã³ã® cardinalityïŒ1:1 / 1:N / N:MïŒã¯æ£ããã
- [ ] createdAt / updatedAt ãæã£ãŠããã
- [ ] ãœããããªãŒããå¿
èŠãæ€èšããããã®ãã§ãã¯ã¯ã1 ã¢ãã«ããã 2ã3 åã§çµãããŸãã
5 ã¢ãã«ãã£ãŠã 15 åçšåºŠã§ãã
ãã¹ããã 3ã 倿Žãå¿ èŠãªç®æã¯ãã€ã°ã¬ãŒã·ã§ã³åã«çŽã
ã¹ããã 2 ã§çºèŠããåé¡ã¯ãæåã®ãã€ã°ã¬ãŒã·ã§ã³å®è¡åã«çŽããŸãã
äžåºŠ prisma migrate dev ãå®è¡ããŠãã€ã°ã¬ãŒã·ã§ã³ãã¡ã€ã«ãçæãããšã倿Žã®ãã³ã«æ°ãããã€ã°ã¬ãŒã·ã§ã³ãã¡ã€ã«ãå¢ããŸãã
æ¬çªã«åºãåã®æ®µéã§ä¿®æ£ããã°ãéçºç°å¢ã®ãã€ã°ã¬ãŒã·ã§ã³å±¥æŽã¯ prisma migrate reset ã§ãªã»ããã§ããŸãã
æ¬çªåã«çŽãã³ã¹ããšæ¬çªåŸã«çŽãã³ã¹ãã®å·®ã¯ãããŒã¿éã«æ¯äŸããŠåºãããŸãã
åŸã§çŽããéžæè¢ããå€ã
Prisma ã®æžããããã¯æ¬ç©ã§ãã
ã¹ããŒããæžãããšãžã®ããŒãã«ãäœããåå®å
šãªã³ãŒããèªåçæãããäœéšã¯ãä»ã® ORM ã«ã¯ãªããã®ããããŸãã
ãã®æžããããã«ä¹ããªãããåŸã§çŽããšããéžæè¢ãèšèšæã«å°ããã
ãããã1 幎åŸã®èªåãžã®ãã¡ã°ãã®èŠªåã ãšãåã¯æã£ãŠããŸãã
å®ç§ãªã¹ããŒãã¯æåããååšããŸããã
ããããåŸã§å¿
ãåŸæããèšèšå€æã¯ãäºåã«é²ãããšãã§ããŸãã
ä»ã®ã¹ããŒããã5 åã ãèŠçŽããŠã¿ãŸãããã
ããããŠèªã¿ãã
⌠Prisma ã®ã¯ãšãªå®è¡æã®ããã©ãŒãã³ã¹åé¡ã«çŽé¢ãããšãã«
ã¹ããŒãèšèšãæ£ãããŠããã¯ãšãªã®æžãæ¹ã§å°çã«èœã¡ãããšãããã
N+1 åé¡ã®çºèŠãã解決ãŸã§ãå®éã®ã³ãŒããšå
±ã«èšé²ããèšäºã
ã¹ããŒãèšèšã®æ¬¡ã«èªããšãèšèšãšå®è¡ã®äž¡èŒªãæããŸãã
⌠èªå¯ãå¢çãæåã«æ±ºããŠãææ»ããé²ããããšãã«
ã¹ããŒããšåãããèªå¯ãåŸã§çŽããäžçªã³ã¹ãããããé åã
æåã 9 å²ã«ãªãèšèšã®èãæ¹ãšãNextAuth.js ã䜿ã£ãæå°å®è£
ã§ãæ¬çªåŸã®ææ»ããé²ããŸãã
⌠Server Actions ããã©ãŒã ã®å¢çããæ¬çªåã«åºããããšãã«
ãã©ãã§ããªããŒã·ã§ã³ãããããèªå¯ã¯èª°ãæ
ããããå
ã«æ±ºããŠããèšèšè«ã
Prisma ã®ã¹ããŒããšåãããŠèªããšãããŒã¿å±€ãã API å±€ãŸã§äžè²«ããåŸã§çŽããªãèšèšãã€ã¡ãŒãžã§ããŸãã
⌠Next.js ã®ãã©ãŒã ãäºæ ãããã«äœããããšãã«
å
¥åãšèšå®ãæåããåãšããªããŒã·ã§ã³ã§å®ã話ã
ã¹ããŒããæ£ããèšèšããããšããã®äžã«ä¹ããã©ãŒã å±€ãŸã§äžæ°ã«å
ãããã人ã«åºãããŸãã
⌠ç°å¢å€æ°ãèšå®ãåŸã§çŽããããããããšãã«
ã¹ããŒããšåãããèšå®ãåããããããã§æµããšæ¬çªã§çãç®ãèŠãã
Zod ã§æ€èšŒãä»èŸŒãå
·äœçãªããæ¹ã§ãèšå®ãŸãããæåããå®ããŸãã
⌠åãã°ããã§æžããŠãåŸãããã¹ãã§æ³£ããããªãã£ããšãã«
åãã°ããã¯ã¹ããŒãã§ããã¹ãã§ãåãçœ ã
åŸããçŽãã³ã¹ãã®å€§ãããšãæåãããã¹ããæžãçç±ããäœéšè«ã§è
¹èœã¡ããŸãã
⌠ãšã©ãŒããã°ãæåã«æ±ºããŠãããããšãã«
ã¹ããŒããæåã«èŠçŽãã®ãšåãçºæ³ã§ããšã©ãŒãšãã°ã®å¢çãå
ã«æ±ºããŠãã話ã
å人éçºã®ããã¯ãšã³ããäžéãå
ãããã人åãã§ãã
âŒ æªæ¥ã®èªåãå®ãèšèšã®èãæ¹ãèšèã«ããããšãã«
åŸã§çŽããéžã°ãªãçç±ããéãããæç¶å¯èœæ§ã®èŠç¹ã§èšèªåãããšãã»ã€ã
èšèšã§æ©ãã ãšãã«èäžãæŒããŠãããŸãã
⌠Prisma ããããã䜿ãå§ãããšãã«
Prisma ãå°å
¥ãããã£ãããšãåå®å
šãª DB ã¢ã¯ã»ã¹ã§åŸãããå®å¿æããŸãšããèšäºã
ã¹ããŒãèšèšã®èšäºãšããããŠèªããšãèšèšã®ãªããããäŒãããŸãã
ã²ãšãããš
ã¹ããŒãèšèšã§å€±æãããã³ã«æãã®ã¯ãããã®ãšã 15 åã ãèŠçŽããŠããã°ãã§ãã
ã³ãŒãã®ãªãã¡ã¯ã¿ãªã³ã°ã¯æ¯èŒçæ°è»œã«ã§ããŸãã
颿°åãå€ããŠããããžãã¯ãæŽçããŠããã¢ããªã±ãŒã·ã§ã³ã®æ¯ãèãèªäœã¯ããã«æ»ããŸãã
ã¹ããŒãã®å€æŽã¯éããŸãã
äžåºŠæ¬çªããŒã¿ãå
¥ããšãå
ã«æ»ããšããéžæè¢ãå®è³ªçã«ãªããªãããšãããã
ã ãããããæåã® 15 åã倧äºã§ãã
誰ãã®åŸã§çŽãããæžããŸãããã«ã
