Prisma Migration Conflict সমাধানের নির্দেশিকা
প্রোডাকশন ডাটাবেসে prisma migrate reset চালাবেন না।
যদি আপনি এমন কোনো মেসেজ দেখেন যেখানে বলা হয়েছে যে একটি মাইগ্রেশন পরিবর্তন করা হয়েছে অথবা আপনাকে স্কিমা রিসেট করতে হবে, তবে থেমে যান। রিসেট করলে আপনার সমস্ত ডেটা মুছে যাবে। আপনি কোনো কিছু না হারিয়েই এই কনফ্লিক্টগুলো ম্যানুয়ালি সমাধান করতে পারেন।
সাধারণ Prisma এরর এবং সেগুলো সমাধানের উপায়
Error: মাইগ্রেশন চলাকালীন ব্যর্থ হয়েছে (P3018)
• SQL ফাইলটি ঠিক করুন।
• Run: npx prisma migrate resolve --rolled-back [migration_name]
• Run: npx prisma db execute --file [path_to_sql_file]
• Run: npx prisma migrate resolve --applied [migration_name]
Error: মাইগ্রেশন প্রয়োগ করার পর পরিবর্তন করা হয়েছে (Checksum mismatch)
• আপনার বর্তমান মাইগ্রেশন ফাইলের SHA-256 হ্যাশ (hash) গণনা করুন।
• _prisma_migrations টেবিলে checksum আপডেট করুন।
• গুরুত্বপূর্ণ: ওই মাইগ্রেশন নামের জন্য সমস্ত রো (row) আপডেট করুন। rolled_back_at দিয়ে ফিল্টার করবেন না।
Error: Shadow database কলাম নেই (P3006) • এটি তখন ঘটে যখন একটি মাইগ্রেশন এমন একটি কলামকে রেফার করে যা পরবর্তী কোনো মাইগ্রেশনে তৈরি করা হয়েছে। • Prisma টাইমস্ট্যাম্প (timestamp) অনুযায়ী মাইগ্রেশনগুলো পুনরায় চালায়। • সমাধান: SQL কোডটি সেই মাইগ্রেশনে সরিয়ে নিন যেখানে কলামটি প্রথমবার তৈরি করা হয়েছে।
Error: RLS পলিসি দ্বারা DROP COLUMN ব্লক করা হয়েছে
• PostgreSQL Row Level Security পলিসিগুলোকে কলামের সাথে যুক্ত করে।
• সমাধান: কলাম ড্রপ করার সময় CASCADE ব্যবহার করুন।
• উদাহরণ: ALTER TABLE "my_table" DROP COLUMN IF EXISTS "tenant_id" CASCADE;
নিরাপদ মাইগ্রেশনের জন্য সেরা অনুশীলনসমূহ (Best Practices)
- প্রথমে ডাটাবেস কুয়েরি করুন। কোনো কলাম বা ইনডেক্স আছে কি না তা অনুমান করবেন না। মাইগ্রেশন কোড লেখার আগে আপনার প্রকৃত ডাটাবেস স্কিমা পরীক্ষা করতে সরাসরি SQL কুয়েরি ব্যবহার করুন।
IF EXISTSএবংIF NOT EXISTSব্যবহার করুন। এটি আপনার মাইগ্রেশনকে idempotent করে তোলে। একটি idempotent মাইগ্রেশন কোনো এরর ছাড়াই একাধিকবার চালানো সম্ভব।- কনস্ট্রেইন্টের (constraints) জন্য
DOব্লক ব্যবহার করুন। Foreign Key যোগ করার সময় সেটি একটি চেকের মধ্যে রাখুন যাতে দেখা যায় কনস্ট্রেইন্ট নামটি ইতিমধ্যে বিদ্যমান কি না। - আপনি যদি Row Level Security ব্যবহার করেন, তবে ড্রপ করার সময় সবসময়
CASCADEব্যবহার করুন।
সারসংক্ষেপ টেবিল
• P3018 (চলাকালীন ব্যর্থ): SQL ঠিক করুন, তারপর resolve --rolled-back এবং resolve --applied ব্যবহার করুন।
• Checksum mismatch: নতুন হ্যাশ গণনা করুন এবং _prisma_migrations-এর সমস্ত রো আপডেট করুন।
• Shadow DB error: আপনার টাইমস্ট্যাম্প অর্ডার চেক করুন এবং SQL লজিক সরিয়ে নিন।
• RLS error: আপনার DROP স্টেটমেন্টে CASCADE যোগ করুন।
