คู่มือการแก้ไขความขัดแย้งในการทำ 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 นั้นสามารถรันซ้ำหลายครั้งได้โดยไม่ทำให้เกิดข้อผิดพลาด
  • ใช้ DO blocks สำหรับ 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 ของคุณ

แหล่งที่มา: https://dev.to/aswindanu_anwar_38c31d278/the-only-guide-you-need-for-prisma-migration-conflicts-without-losing-data-6bc