การ 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!)

✅ ทำแบบนี้:

  1. สร้าง migration แบบ empty:
npx prisma migrate dev --create-only --name rename_column
  1. แก้ไข SQL ที่สร้างขึ้น:
ALTER TABLE "User" RENAME COLUMN "oldName" TO "newName";
  1. รัน 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 ขึ้น productionnpx prisma migrate deploy
Rename column (ไม่ให้หาย)migrate dev --create-only แล้วแก้ SQL
Reset ทั้งหมด (local only)npx prisma migrate reset