کدام دیتابیسها با سیستم migration جنگو سازگارترند؟

از بین دیتابیس های معمول برای استفاده در یک وب اپلیکیشن MySQL، PostgreSQLو SQLite پراستفاده ترند. اگر بخواهیم برای یک پروژه Django از یکی از اینها استفاده کنیم باید بدانیم سیستم Migration جنگو با همه آنها به صورت یکسان سازگار نیست. تفاوت سازگاری در آنها در چیست؟

PostgreSQL

سازگارترین دیتابیس با Migration جنگو PostgreSQL است

MySQL

این دیتابیس در عملیات تغییر schema در model ها از تراکنشها transactions پشتیبانی نمی کند (البته با موتور ذخیره سازی InnoDB از transactions هم پشتیبانی میکند به جز برخی عملیاتهای دیتابیس مانند تغییر در schema که در لینک میبینید) یعنی اگر در عملیات مایگریشن به خطایی برخورد بکند تغییرات قبلی rollback نمی شود و ممکن است دیتابیس را معیوب کند و باید تغییرات را به صورت دستی درست کنیم.

علاوه بر آن در هر عملیات مایگریشن این دیتابیس تمام اسکیماها و جدولها و ایندکس ها را از اول rewrite میکند که این در دیتابیسهای بزرگ پرهزینه است زیرا ممکن است دیتابیس production برای زمان زیادی پاسخگو نباشد.

نهایتا MySQL محدودیتهای دیگری هم دارد مانند طول نام ستونها و Index ها. این یعنی ممکن است اگر ایندکسی برای دیتابیس دیگر کار کند که طول نام آن از محدودیت MySQL بیشتر باشد با مایگریشن به این دیتابیس عملیات به خطا بخورد.

SQLite

استفاده از این دیتابیس در پروداکشن و پروژه های جدی توصیه نمی شود بخاطر محدودیتاهای شدید در تغییر اسکیما در عملیات مایگریشن که جزئیات این محدودیت ها در این لینک قابل مشاهده است.

ساخت کامند کاستوم در django-admin

توی جنگو میشه برای یک app کامند کاستوم custom command نوشت. use case های زیادی میتونه داشته باشه. فرض کنیم یه model داریم به اسم campaign که مربوط به قرعه کشی هایی هست که توی وبسایت فروشگاهمون وجود داره. این کمپین فقط عید نوروز فعاله و یه فیلد داره به اسم active که برابر با true میشه. حالا بعد از نوروز میخایم اون رو غیرفعال کنیم بهتره که بتونیم با یه کامند این تغییر رو توی دیتابیس بدیم.

برای این کار یک کامند برای campaign app میسازیم. از این به بعد هر پروژه ای که این app را به INSTALLED_APP اضافه کنه این کامند رو هم خواهد داشت. برای این کار باید توی app مورد نظر یه package با ساختار زیر بسازیم.

توی فایل campaigneactivation.py باید یه کلاس به اسم Command بسازیم که از کلاس BaseCommand ارث بری میکنه.

این کامند الان اضافه شده و میشه به شکل زیر ازش استفاده کرد.

کلاس BaseCommand پارامترهای زیادی داره که جزئیاتش تو این لینک هست

context manager توی پایتون چیه؟ به چه دردی میخوره و چطور میشه یکی نوشت؟

این سوالی بود که توی یکی از مصاحبه های کاری از من پرسیده شد و مدیر فنی اون شرکت میگفت توی یک پروژه ما نیاز داشتیم خودمون یک context manager بنویسیم.

بدلیل محدودیت منابع در سیستم، وجود مکانیزمی که برای مدیریت منابع یعنی گرفتن و رهاسازی اتوماتیک منابع می تواند به مدیریت منابع و جلوگیری از آن کمک کند. منابعی مثل فایل، کانکشن های دیتابیس و … این وظیفه context manager هست

توی پایتون برای باز کردن یک فایل میشه از کلیدواژه with استفاده کنیم. اینجا دقیقا داریم از یک context manager استفاده میکنیم. context manager به ما اجازه میده که یک resource رو به خوبی allocate کنیم و بعد از استفاده آزاد کنیم. فرض کنید که دو عملیات مرتبط دارید و میخاید این دو عملیات با هم به صورت جفتی توی یک بلاک کد انجام بشه، context manager به شما این امکان رو میده که این کار رو انجام بدید. مثلا میخایم یک فایل رو باز کنیم و توش بنویسیم و اگر در حین نوشتن توی فایل به ارور خوردیم فایل خودبه خود بسته بشه، یعنی یه جورایی این فایل که یک resource هست رو allocate کردیم و در آخر هم به درستی آزادش میکنیم و عملا هم این چندتا کار به هم مرتبط هستن و باید جفتی با هم توی یه بلاک کد انجام بشه: باز کردن نوشتن و بستن.

کد زیر دقیقا معادل کد بالاست وقتی که از context manager استفاده نکنیم. میبینید که اولا از کد بیشتری استفاده شده ثانیا دو عملیاتی که بهم مرتبط هستند و بهتر بود در یک بلاک کد استفاده شود از هم جدا شدند:

پیاده سازی context manager به صورت class

فقط با تعریف کردن متدهای __enter__ و __exit__ یک context manager ساخته ایم و میتوانیم از آن در بلاک with استفاده کنیم

جزئیات بیشتر در لینک زیر موجوده

https://book.pythontips.com/en/latest/context_managers.html

use case های دیگه ای هم برا context manger توی لینک زیر میبینیم

https://www.geeksforgeeks.org/context-manager-in-python/

https://www.linkedin.com/pulse/context-managers-python-gautam-kumar/

سوالات مصاحبه

  1. context manager توی پایتون چیه؟ به چه دردی می خوره و چطور می شه یکی نوشت؟
    • https://book.pythontips.com/en/latest/context_managers.html
    • https://www.geeksforgeeks.org/context-manager-in-python/
  2. middleware توی جنگو رو توضیح بدید.
  3. فرض کنید توی یک حلقه یک آبجکت ORM میسازیم و توی همون لوپ توی دیتابیس save میکنیم. این حلقه یک میلیون بار تکرار میشه. آیا این مشکلی داره؟ اگه داره راه حلش چیه؟
  4. فرض کنید یک اپلیکیشن مثل توییتر می نویسیم و صفحه اول توئیت ها رو میبینیم ساختار API این صفحه رو بگید.
  5. فرض کنید داریم یک اپلیکیشن URL shortner مینویسیم از چه تکنولوژی هایی توی این پروژه استفاده میکنیم؟ stack
  6. فرض کنید یک جدول توی دیتابیس داریم توی ستون آخر دو تا تگ ذخیره می شه وسط پروژه فهمیدیم این ستون بهتره به دو ستون تبدیل بشه. چطور این ستون رو به دو ستون تبدیل می کنیم. در نظر بگیرید دیتای میلیونها کاربر توی جدول وجود داره و به پروداکشن هم دسترسی نداریم. توی این پروژه هم از ORM داریم استفاده می کنیم.
  7. فرض کنید دو تا تیبل دیتابیس داریم که رابطه 1-n را هم دارن دیتای جدول دوم رو میخایم به صورتی که دیتای جدول اول هم کنارش باشه. بهینه ترین query که میتونیم بزنیم چطوره؟
  8. مدل دیتابیس یک سایت ارائه دهنده فیلم مثل IMDB رو پیاده سازی کن (فیلم، لایک، عکس فیلم ها، فیلم های مشابه و کاربران). مدل API و معماری رو هم طراحی کن.
  9. مدل دیتابیس و معماری نرم افزار توئیتر رو طراحی کن.
  10. فرق Model با Serializer چیه؟
  11. decorator چیه؟
  12. generator توی پایتون چیه؟
    • https://wiki.python.org/moin/Generators
  13. operator overloading توی پایتون چطور پیاده سازی میشه؟
  14. Manager توی جنگو چه کاربردی داره؟
  15. از Celery استفاده کردی؟ چرا؟
  16. فرض کن دوتا App توی جنگو داری که به هم مرتبط هستند. مثلا اگر یک متد توی App اول اجرا میشه بعدش یک متد یا پارامتر توی App دوم رو استفاده میکنه. آیا این از دید مهندسی نرم افزار مشکل داره؟ اگر داره راه حل چیه؟
  17. از Multiprocessing و Multithreading توی پایتون استفاده کردید؟ محدودیت ها مزایا و معایبش رو بگید. از هر کدوم توی چه use case ای باید استفاده بشه.
  18. فرق ماژول با پکیج توی پایتوی چیه؟
  19. migration توی جنگو چیه و کاربردش چیه؟
  20. فرض کنید توی یک اپلیکیشن وب یک درخواست میدیم (مثل درخواست خرید توی فروشگاه) درخواست 5 دقیقه طول میکشه و fail میشه. این ایراد رو چطور ریشه یابی میکنید؟
  21. فرض کنید توی DRFمیخایم response هایی که به کاربر برگردونده میشه رو از نظر ساختار پاسخ (status، پیغام و …) یکپارچه کنیم. چطور این کار رو می کنیم؟
  22. فرض کنید توی جنگو توی Model های مختلف میخایم رو تمامی query هایی که به دیتابیس ارسال میشه یک تغییر یکسان بدیم (مثلا یک فروشگاه داریم میخایم از امروز توی تمامی query ها اطلاعات 2020 به قبل رو نشون نده) برای این کار بهترین راه حل تغییر مدل ها چیه؟
  23. خروجی کد زیر چه می شود و تحلیل کنید:

24. تسک های ناتمام در Celery چه اتفاقی براش میوفته

25. چه وقت هایی باید از multithreading یا Multiprocessing یا Celery استفاده کرد؟