การ Migrate Database เมื่อต้องการเปลี่ยนแปลง Schema
บทนี้อธิบายวิธีการ migrate database สำหรับ Development และ Production
การแก้ไข Schema ของ Database ด้วยการ Migration
Development: migrate dev
ใช้ขณะพัฒนาบนเครื่อง local หรือ Codespaces
npx prisma migrate dev --name <descriptive_name>
สิ่งที่ทำ:
- เปรียบเทียบ schema กับ database
- สร้างไฟล์ SQL ใน
prisma/migrations/ - รัน SQL บน database
- สร้าง Prisma Client ใหม่
Production: migrate deploy
ใช้ตอน deploy ขึ้น production (Railway จะรันให้อัตโนมัติ)
npx prisma migrate deploy
สิ่งที่ทำ:
- ตรวจสอบ migrations ที่ยังไม่ได้รัน
- รัน migrations ตามลำดับ
- ไม่ลบข้อมูล (ยกเว้น migration มีคำสั่ง DROP)
💡 Railway config (
railway.json) ใช้คำสั่งนี้อัตโนมัติในpreDeployCommand
Common Scenarios
Scenario A: Rename Column (ไม่ให้ data หาย)
❌ อย่าทำ: แก้ชื่อใน schema แล้วรัน migrate dev ตรงๆ (Prisma จะ DROP column!)
✅ ทำแบบนี้:
- สร้าง migration แบบ empty:
npx prisma migrate dev --create-only --name rename_column
- แก้ไข SQL ที่สร้างขึ้น:
ALTER TABLE "User" RENAME COLUMN "oldName" TO "newName";
- รัน migration:
npx prisma migrate dev
Scenario B: Reset Database (เริ่มใหม่หมด)
ถ้าข้อมูล local พัง หรือต้องการเริ่มใหม่:
npx prisma migrate reset
⚠️ Warning: คำสั่งนี้จะ:
- ลบข้อมูลทั้งหมด
- รัน migrations ใหม่ตั้งแต่ต้น
- รัน seed script
Scenario C: “Drift detected” Error
เกิดเมื่อ database schema ไม่ตรงกับ migration history (เช่น เคยใช้ db push)
แก้ไข:
npx prisma migrate reset
สรุป Commands
| สถานการณ์ | Command |
|---|---|
| แก้ไข schema (development) | npx prisma migrate dev --name <name> |
| Deploy ขึ้น production | npx prisma migrate deploy |
| Rename column (ไม่ให้หาย) | migrate dev --create-only แล้วแก้ SQL |
| Reset ทั้งหมด (local only) | npx prisma migrate reset |