در این مقاله قصد داریم به کلاس MigrationManager از Odoo بپردازیم که با همین ساختار در نسخه ERP تحت وب ویراوب۱۲۳ نیز اضافه شده است. این کلاس مهاجرت ماژول ها را مدیریت می کند. انتقال داده فرآیند نگهداری داده های صحیح در پایگاه داده پس از به روز رسانی به نسخه جدید ماژول است. به عنوان مثال، در نسخه جدید ماژول حضور غیاب اینترنت اشیا، ما برخی از انواع فیلدهای موجود را تغییر دادیم، و برای اینکه داده های فیلد موجود از بین نرود، باید اسکریپت های مهاجرت را بنویسیم تا آن داده ها با تغییرات فیلد جدید حفظ شود. بنابراین مدیر مهاجرت اودوو این اسکریپت های مهاجرت را مدیریت خواهد کرد.
فایل های مهاجرت در یک ساختار درخت دایرکتوری مرتب میشوند. برای هر نسخه ماژول باید پوشه اصلی "migrations" با زیرپوشه ها وجود داشته باشد. نسخه یا نسخه ماژول یا نسخه server.module است. هر زیر پوشه دارای چندین فایل پایتون است. نام فایل های پایتون باید با "pre-"، "post" یا "end-" شروع شود. ترتیب اجرای فایل های پایتون با نام آنها مشخص می شود. همه فایلهای پایتون با نامهایی که با «pre-» شروع میشوند، قبل از مقداردهی اولیه ماژول اجرا میشوند و نام فایلهایی که با «post-» شروع میشوند، پس از مقداردهی اولیه ماژول اجرا میشوند. اسکریپت های "end-" پس از به روز رسانی همه ماژول ها اجرا می شوند. یک پوشه خاص به نام "0.0.0" حاوی اسکریپتی است که در هر تغییر نسخه اجرا می شود. اسکریپت هایی که باید در هر تغییر نسخه اجرا شوند را می توان در این پوشه نگه داشت. در مرحله پیش، اسکریپت های این پوشه ها ابتدا اجرا می شوند، در حالی که در مرحله پست و پایان، این اسکریپت ها آخرین اجرا خواهند شد.
در تصویر زیر ساختار پوشههای یک نمونه از مهاجرتهای نوشته شده آمده است.
فایل های پایتون باید دارای تابعی به نام migrate باشند. این تابع دارای دو آرگومان است، مکان نما پایگاه داده و نسخه نصب شده فعلی را تعیین میکند. حالا اسکریپت شما بر اساس این دو تابع باید تعیین کند که مهاجرت چگونه باید انجام شود.
نحوه اجرای اسکریپتهای مهاجرت
اسکریپت های مهاجرت نیازی به ثبت نام یا درج در جایی ندارند. Odoo اسکریپت های مهاجرت را بر اساس نسخه به روز شده ماژول جستجو میکند. هنگام به روز رسانی یک ماژول، اگر یک پوشه migrations وجود داشته باشد، Odoo در داخل پوشه migrations به دنبال پوشه هایی با نسخه های برابر یا بین نسخه ای که قرار است به روز شود، می پردازد. این قبل از پردازش هر فایل دیگری اتفاق می افتد. اگر این پوشه وجود داشته باشد، اسکریپت های "pre-" migrations اجرا می شوند. این اسکریپت ها قبل از پردازش هر فایل دیگری اجرا می شوند، بنابراین هیچ تغییری در پایگاه داده در این مرحله وجود ندارد.
پس از اجرای تمام اسکریپت های پیش از مهاجرت، Odoo ماژول را به روز می کند و تغییرات در پایگاه داده اعمال میشود. پس از ارتقاء ماژول، پایگاه داده ممکن است با نسخه های قبلی متفاوت باشد. پس از بهروزرسانی ماژول، Odoo اسکریپتهای پس از مهاجرت را بر اساس نسخه جستجو میکند و همه اسکریپتهای پس از مهاجرت نسخه مرتبط اجرا میشوند.
پایان اسکریپت مهاجرت پس از به روز رسانی تمام ماژول ها اجرا می شود.
اگر بعداً در طول فرآیند بهروزرسانی موتور، خطایی رخ دهد، بهروزرسانیهای مهاجرت بازگردانده نمیشوند. بنابراین همیشه سعی کنید ابتدا ماژول خود را با یک اسکریپت مهاجرت کپی به روز کنید.
بیایید با یک مثال بررسی کنیم
در ماژول سفارشی ویراوب۱۲۳ برای حضور و غیاب با اینترنت اشیا، یک مدل "hr.attendance.shadow" وجود دارد که شامل یک فیلد درصدی باید باشد. در حال حاضر، نوع فیلد "عدد صحیح" است که باید به نوع درصدی تبدیل شود. من می خواهم نوع فیلد را به شناور تغییر دهم. کار آسانی خواهد بود، فقط باید تعریف فیلد را در فایل پایتون تغییر دهم، اما در حال حاضر، مقداری داده در فیلد درصد وجود دارد و من می خواهم آن داده ها را حفظ کنم، بنابراین باید نوع فیلد را بدون از دست دادن تغییر دهم. مقدار فعلی در آن فیلد در حال حاضر وقتی نوع فیلد را تغییر می دهم تمام داده های موجود آن فیلد از بین می رود. با نوشتن یک اسکریپت مهاجرت، می توانیم آن داده ها را حفظ کنیم. در اینجا ما فقط به داده های عدد صحیح نیاز داریم تا نوع داده را شناور کنیم.
این ساختار ماژول من خواهد بود،
من یک پوشه migrations اضافه کرده ام و یک زیرپوشه با نسخه ماژول مربوطه ایجاد کرده ام (نسخه ماژولی که برای آن به روز می کنم).
در فایل پیش از مهاجرت،
باید یک تابع "مهاجرت" وجود داشته باشد. در داخل تابع migrate، ما در حال پیاده سازی منطق هستیم.
def migrate(cr, version):
cr.execute('ALTER TABLE material_requisition ADD COLUMN temp_percentage float')
cr.execute('UPDATE material_requisition SET temp_percentage=percentage')
در اسکریپت پیش از مهاجرت، مقادیر فعلی فیلد درصد را در یک فیلد موقت ذخیره می کنیم. پس از به روز رسانی ماژول، داده های فیلد درصد از بین می رود.
در فایل پس از مهاجرت،
def migrate(cr, version):
cr.execute('UPDATE material_requisition SET percentage=temp_percentage')
cr.execute('ALTER TABLE material_requisition DROP COLUMN temp_percentage')
در اینجا ما داده های فیلد موقت را به فیلد درصد به روز شده ذخیره می کنیم و فیلد موقت از پایگاه داده حذف می شود.
بنابراین با تغییر نوع فیلد درصد، هیچ داده ای از بین نمی رود.
در فایل مانیفست، نسخه جدید ماژول را به روز کرده ام. بر اساس این نسخه، اسکریپت های مهاجرت در پوشه migrations جستجو خواهند شد.
.
این همه در مورد اودوو MigrationManager است و برای جلوگیری از از دست رفتن داده ها در حین ارتقاء ماژول ها به نسخه جدید مفید خواهد بود.
مهاجرت دادهها در اودوو و نسخه ERP تحت وب ویراوب۱۲۳ از نسخه های قدیمی به جدید