คู่มือการแก้ไขความขัดแย้งในการทำ Prisma Migration
ห้ามรัน prisma migrate reset บนฐานข้อมูลที่ใช้งานจริง (production database)
หากคุณเห็นข้อความแจ้งว่า migration ถูกแก้ไข หรือคุณจำเป็นต้อง reset schema ให้หยุดทันที การ reset จะทำให้ข้อมูลทั้งหมดของคุณถูกลบ คุณสามารถแก้ไขความขัดแย้งเหล่านี้ได้ด้วยตนเองโดยไม่สูญเสียข้อมูลใดๆ
ข้อผิดพลาดทั่วไปของ Prisma และวิธีแก้ไข
ข้อผิดพลาด: Migration ล้มเหลวระหว่างการทำงาน (P3018)
• แก้ไขไฟล์ SQL
• รัน: npx prisma migrate resolve --rolled-back [migration_name]
• รัน: npx prisma db execute --file [path_to_sql_file]
• รัน: npx prisma migrate resolve --applied [migration_name]
ข้อผิดพลาด: Migration ถูกแก้ไขหลังจากที่นำไปใช้แล้ว (Checksum mismatch)
• คำนวณค่า SHA-256 hash ของไฟล์ migration ปัจจุบันของคุณ
• อัปเดต checksum ในตาราง _prisma_migrations
• สำคัญ: อัปเดตทุกแถวที่มีชื่อ migration นั้นๆ ห้ามกรองด้วย rolled_back_at
ข้อผิดพลาด: ไม่พบคอลัมน์ใน Shadow database (P3006) • สิ่งนี้เกิดขึ้นเมื่อ migration หนึ่งมีการอ้างอิงถึงคอลัมน์ที่ถูกสร้างขึ้นโดย migration ตัวถัดไป • Prisma จะรัน migration ซ้ำตามลำดับเวลา (timestamp order) • วิธีแก้ไข: ย้ายโค้ด SQL ไปยัง migration ที่มีการสร้างคอลัมน์นั้นเป็นครั้งแรก
ข้อผิดพลาด: การ DROP COLUMN ถูกบล็อกโดยนโยบาย RLS
• PostgreSQL Row Level Security จะผูกนโยบายไว้กับคอลัมน์
• วิธีแก้ไข: ใช้ CASCADE เมื่อต้องการลบคอลัมน์
• ตัวอย่าง: ALTER TABLE "my_table" DROP COLUMN IF EXISTS "tenant_id" CASCADE;
แนวทางปฏิบัติที่ดีที่สุดเพื่อความปลอดภัยในการทำ Migration
- ตรวจสอบฐานข้อมูลก่อนเป็นอันดับแรก อย่าคาดเดาว่ามีคอลัมน์หรือ index อยู่หรือไม่ ให้ใช้คำสั่ง SQL โดยตรงเพื่อตรวจสอบ schema ของฐานข้อมูลจริงก่อนที่จะเขียนโค้ด migration
- ใช้
IF EXISTSและIF NOT EXISTSเพื่อทำให้ migration ของคุณเป็น idempotent ซึ่งหมายความว่า migration นั้นสามารถรันซ้ำหลายครั้งได้โดยไม่ทำให้เกิดข้อผิดพลาด - ใช้
DOblocks สำหรับ constraints โดยการครอบการเพิ่ม Foreign Key ด้วยการตรวจสอบว่ามีชื่อ constraint นั้นอยู่แล้วหรือไม่ - ใช้
CASCADEเสมอเมื่อทำการ drop หากคุณมีการใช้งาน Row Level Security
ตารางสรุป
• P3018 (ล้มเหลวระหว่างการทำงาน): แก้ไข SQL จากนั้นใช้ resolve --rolled-back และ resolve --applied
• Checksum mismatch: คำนวณ hash ใหม่และอัปเดตทุกแถวใน _prisma_migrations
• Shadow DB error: ตรวจสอบลำดับ timestamp และย้าย logic ของ SQL
• RLS error: เพิ่ม CASCADE ในคำสั่ง DROP ของคุณ
