המדריך לפתרון קונפליקטים ב-Prisma Migration
אל תריצו prisma migrate reset על מסד נתונים בייצור (production).
אם אתם רואים הודעה המציינת שמיגרציה שונתה או שעליכם לאפס את הסכימה (schema), עצרו. איפוס ימחק את כל הנתונים שלכם. ניתן לפתור את הקונפליקטים הללו ידנית מבלי לאבד דבר.
שגיאות Prisma נפוצות וכיצד לתקן אותן
שגיאה: המיגרציה נכשלה באמצע הריצה (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]
שגיאה: המיגרציה שונתה לאחר שיושמה (Checksum mismatch)
• חשבו את ה-hash מסוג SHA-256 של קובץ המיגרציה הנוכחי שלכם.
• עדכנו את ה-checksum בטבלת _prisma_migrations.
• חשוב: עדכנו את כל השורות עבור שם המיגרציה הזה. אל תסננו לפי rolled_back_at.
שגיאה: עמודה חסרה ב-Shadow database (P3006) • זה קורה כאשר מיגרציה מתייחסת לעמודה שמיגרציה מאוחרת יותר יוצרת. • Prisma מריצה מחדש את המיגרציות לפי סדר חותמת הזמן (timestamp). • פתרון: העבירו את קוד ה-SQL למיגרציה שבה העמודה נוצרת לראשונה.
שגיאה: פעולת DROP COLUMN נחסמה על ידי מדיניות RLS
• Row Level Security ב-PostgreSQL קושר מדיניות לעמודות.
• פתרון: השתמשו ב-CASCADE בעת מחיקת עמודות.
• דוגמה: ALTER TABLE "my_table" DROP COLUMN IF EXISTS "tenant_id" CASCADE;
שיטות עבודה מומלצות למיגרציות בטוחות
- שאלו את מסד הנתונים תחילה. אל תנחשו אם עמודה או אינדקס קיימים. השתמשו בשאילתות SQL ישירות כדי לבדוק את סכימת מסד הנתונים בפועל לפני כתיבת קוד המיגרציה.
- השתמשו ב-
IF EXISTSו-IF NOT EXISTS. זה הופך את המיגרציות שלכם לאידמפוטנטיות (idempotent). מיגרציה אידמפוטנטית יכולה לרוץ מספר פעמים מבלי לגרום לשגיאות. - השתמשו בבלוקי
DOעבור אילוצים (constraints). עטפו הוספות של Foreign Key בבדיקה כדי לראות אם שם האילוץ כבר קיים. - השתמשו תמיד ב-
CASCADEעבור מחיקות (drops) אם אתם משתמשים ב-Row Level Security.
טבלת סיכום
• P3018 (נכשל באמצע הריצה): תקנו את ה-SQL, ואז השתמשו ב-resolve --rolled-back וב-resolve --applied.
• Checksum mismatch: חשבו hash חדש ועדכנו את כל השורות ב-_prisma_migrations.
• שגיאת Shadow DB: בדקו את סדר חותמות הזמן (timestamp) והעבירו את לוגיקת ה-SQL.
• שגיאת RLS: הוסיפו CASCADE לפקודות ה-DROP שלכם.
