Skip to content
CodeSook
CodeSook

08. Implement database tables


Create Table via Prisma schema

เรารู้แล้วว่า Business ต้องการใช้ Data หน้าตาแบบไหน
ส่วนใหญ่แล้ว database ก็จะใช้ data หน้าตาแบบเดียวกันนั้นแหละ
เราจะมาสร้าง table ให้ตรงกัน ด้วย prisma schema

prisma/schema.prisma
prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model Employee {
id Int @id @default(autoincrement())
name String
role Role @default(Junior_Developer)
department Department
overtimes Overtime[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime?
@@index([role, department])
@@index([department])
}
model Overtime {
id Int @id @default(autoincrement())
date DateTime
hoursWorked Float
reason String
employee Employee @relation(fields: [employeeId], references: [id], onDelete: Cascade)
employeeId Int
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime?
@@index([date])
@@index([employeeId])
}
enum Role {
Junior_Developer
Senior_Developer
Lead
C_Level
}
enum Department {
IT
Accounting
HR
Manager
}

จาก prisma schema ด้านบน เราใส่ @@index เพื่อทำ indexing ด้วย ตอน query จะได้เร็วๆ

จะเห็นว่าเรามี column deletedAt ด้วย ซึ่ง column นี้จะเก็บวันที่ และเป็น null ได้ ตรงนี้เราเอาไว้ทำ soft delete นั้นเอง
ถ้ามีวันที่เราจะถือว่า row นั้นถูกลบ แต่เราแค่ไม่ได้ลบจริงๆ ฉนั้นตอน query ต้องดูด้วยว่า deleteAt = null นะ

Create table in local Database

prisma มีคำสั่งที่จะแปลง prisma schema ให้ไปสร้าง table บน Database ได้เลย

คำสั่งนี้เราใส่ไว้ใน package.json script แล้ว

creating table from prisma schema
pnpm prisma:push

Create SQL for migration

prisma สามารถสร้างไฟล์ sql จาก prisma schema ได้ ด้วยคำสั่ง

creating SQL for migration
pnpm prisma:migrate

จากนั้นจะได้ folder prisma/migrations เพิ่มมา ในนี้แหละจะมีไฟล์ sql ที่เราได้จาก prisma schema

พอแก้ไข database ก็ให้สั่ง migrate เพื่อสร้าง sql อีกรอบนึงได้

แต่ถ้า database schema ยังไม่นิ่ง ก็ยังไม่ต้องสั่ง migrate ก็ได้ ให้ใช้ prisma db push แทน

หรืออาจจะยังไม่สั่ง migrate จนกว่าจะเอา app ไปไว้บน server