Schema Migration به پروسهای گفته میشود که طی آن دست به تغییر در ساختار برخی جداول دیتابیس، ارتباطات مابین آنها و یا تغییر ستونها میزنیم و نیاز به توضیح نیست که هرچه ساختار دیتابیسی پیچیدهتر باشد، نوشتن اسکریپتهایی که این کار را انجام دهند حساستر میشود.
به دلایلی همچون معماری نامناسب دیتابیس در سالهای گذشته، مجبور شدم در برخی جداول دست به Schema Migration بزنم. خب روال بدین صورت بود که اسکریپت مد نظرم را نوشتم و به صورت لوکال روی یک دیتای نمونه تست کردم. یکی دو بار با اکسپشن مواجه شدم و پس از رفع کردن آنها، اسکریپت مثل ساعت در محیط لوکال کار میکرد اما پس از دیپلوی آن و اجرایش روی سرور Live کلاً داستان عوض شد! مثلاً این یکی از ارورها بود:
Statement could not be executed (HY000 - 1366 - Incorrect string value: '\xF0\x9F\x98\xA4</...' for column 'alias' at row 1)
خب این به دلیل محتوایی بود که توسط کاربر وارد شده بود اما با Collation جدول در تضاد بود و دلیلش هم اینکه چنین محتوایی در دیتای لوکال وجود نداشت که ارور دهد بلکه مربوط به آخرین دادههای ورودی توسط کاربر بود. پس از رفع این اکسپشن، با پیام زیر روبهرو شدم:
Statement could not be executed (23000 - 1062 - Duplicate entry '2876' for key 'PRIMARY')
خب روی کاغذ چنین چیزی امکانپذیر نیست اما در واقعیت میبینیم که اتفاق افتاده و در جدول قبلی از یک Entity با آیدی یکسان دو بار اینسِرت شده بود (توجه داشته باشیم که لغت Insert به صورت اینزِت تلفظ نمیشود بلکه باید گفت اینسِرت که فونتیکش هم /inˈsəːt/ است و کمتر برنامهنویسی را دیدهام که این کلمه را درست تلفظ کند!)
داستان از این قرار بود که دولوپر اول زمانی که داشته دیتا رو اینزِت (ببخشید اینسِرت 😇) میکرده، اصلاً منحصربهفرد بودنش رو چک نمیکرده و وقتی به دلایلی نامعلوم دیتای یکسانی دو بار ثبت میشده، این بار که میخواستم در جدولی که ستون id آن Unique بود دیتا را وارد کنم، به مشکل میخوردم.
در نهایت مجبور شدم دیتای سرور لایو رو دامپ کنم روی لوکال و شروع به تروتمیز کردنش کنم سپس تناقضات روی سرور اصلی رو اول رفع کردم تا در نهایت اسکریپت با موفقیت روی سرور اجرا شد.
نتیجهگیریام این هست که گاهی نمیتونم با دیتای غیرواقعی به نتیجهٔ واقعی دست پیدا کنم و مجبورم دیتای اصلی رو دانلود کنم ولو در حد چندصد مگابایت و روی محیط لوکال تست کنم تا خیالم راحت بشه. حال سؤالم اینه که آیا با چنین چالشهایی تاکنون مواجه شدهاید؟ آیا این روش بنده اصطلاحاً Best Practice یی دارد یا خیر؟ شما در این شرایط چه میکنید؟ نظرات خود رو به اشتراک بگذارید.