متعة صغيرة تافهة # 8: متع صغيرتي للعمل مع قاعدة البيانات

أظهر مسح سريع لزملائي حول مشروعي الحالي أنه مع عبارة "ORM والعمل مع قاعدة البيانات" في الغالبية العظمى من الحالات ، تظهر الكلمات "Alchemy" و "Django ORM". معرفة هاتين الكلمتين ، بشكل عام ، كافية لكتابة رمز نظيف وأنيق وعامل. لكن توسيع آفاق الهندسة لم يؤذي أي شخص حتى الآن ، لذلك سنضيف اليوم إلى صورتنا للعالم بضعة قطع (ربما حتى هذا اليوم غير مألوفة) للعمل مع قاعدة البيانات.



يويو


اليوم ، أي ORM يأتي مع نظام ترحيل قاعدة البيانات الداخلية. طريقة بسيطة ورائعة ، عندما يراقب ORM بنية الجداول ، بشكل عام ، يناسب الجميع. ولكن هذا الحل له حالة من غير المناسب استخدامه:


  • هناك الرجال الذين يطلبون figuat في قاعدة بيانات ، تجاوز ORM. يستخدم هذا شيء مثل asyncpg ونقطة صغيرة مكتوبة ذاتيًا لتبسيط عملية تجميع الطلبات.


    لماذا هؤلاء الرجال التخلي عن وسائل الراحة ORM؟ نعم ، لأن أي برنامج تجميع لقاعدة البيانات يأكل كمية معينة من موارد النظام ، ويحتاج هؤلاء الأشخاص إلى كتابة تعليمات برمجية عالية الأداء. طردوا ORM ، وعلى نحو ما يحتاجون إلى ترحيل القاعدة.


  • قد يكون للمهاجرين الداخليين وجهات نظرهم الخاصة حول ربط وفهرسة السجلات. في بعض الأحيان ، لا يمكن هزيمة طرق العرض ORM هذه في بنية الجدول ؛ يجب إصلاح تصحيحات الاستعلام بنفسك.

في كلتا الحالتين ، من المريح استخدام عمليات الترحيل اليدوي - نحن لا نعتمد على نماذج ORM ، لكن بأيدينا نكتب إرشادات SQL اللازمة ونغذيها في مهاجر بسيط يطبق التغييرات الهيكلية بالتتابع على قاعدة البيانات.


الإخراج هو بنية الجدول نظيفة ومفهومة ويمكن التحكم فيها بالكامل ، تم تجميعها بحكمة.


لمثل هذا النهج اليدوي ، هناك migrator مخطط قاعدة بيانات يويو .


pip install yoyo-migrations 

بعد ذلك ، تتم جميع أعمال إدارة الترحيل باستخدام yoyo القابل للتنفيذ


 yoyo new ./migrations -m "Add column to foo" 

ينشئ الأمر ملفًا يمكنك من خلاله إدخال إرشادات واحدة أو أكثر لترحيل المخطط


 from yoyo import step steps = [ step("CREATE TABLE foo (id INT, bar VARCHAR(20), PRIMARY KEY (id))", "DROP TABLE foo"), ] 

بعد هذا الترحيل ، يمكنك التمرير إلى القاعدة


 yoyo apply --database postgresql://scott:tiger@localhost/db ./migrations 

كل شيء بسيط ، مثل سجلات. وفي الوقت نفسه لديك سيطرة كاملة تماما على كيف تبدو قاعدة البيانات.


هناك نوعان من السلبيات لهذا النهج.


  • يجب أن تتبع مجموعة الحقول في الجداول ومعلماتها مقابض. يؤدي كل تغيير إلى الحاجة إلى كتابة ALTER TABLE بنفسك ، يتم فقد القدرة على ترحيل كل شيء بنقرة واحدة.
  • إن دمج مثل هذه الهجرات يجب أن يتم دائمًا بأيديهم ورؤوسهم. هذا ، بالطبع ، عمل لا لزوم له. ولكن في الممارسة العملية ، تعد النزاعات ودمج الهجرة معقدًا نادرًا.

بيوي


صورة


صغيرة ORM الأكثر شعبية (على الرغم من أنه قد كتب عنها هنا أكثر من مرة) ، والتي ، مع ذلك ، لها جمهورها الخاص.
تم تصميم Peewee ليكون المجمع الأكثر غباء وبساطة لقاعدة البيانات ، مع آلية تنفيذ الاستعلام الأكثر قابلية للفهم ورمز سهل القراءة.


 Users.select().where( Users.user_id == user_id ).get() 

على الرغم من بساطتها وبساطتها وكمية صغيرة من الكود ، فإن بيوي لديها كل ما هو مطلوب للعمل العاقل.


  • أداء مناسب (على الرغم من أنه ليس أسرع سرعة تنفيذ الاستعلام)
  • جميع الأشياء الجيدة الضرورية - مجموعات متنوعة من الحقول ، والعلاقات بين الكيانات ، وتجمعات الاتصال ، ومجموعات من الإضافات والإضافات.
  • هناك تزامن عاقل أكثر أو أقل تمت إضافته بواسطة وحدة peewee_async الخارجية.

المهر orm


المهر هو المجمع الأسطوري. يمكن لطبقة قاعدة البيانات المكتوبة باستخدام ORM تسريع الجزء الخلفي من الحلول الأخرى في بعض الأحيان. لا يوجد سحر في سرعته ، فهناك سياسة مختصة للغاية لتخزين طلبات التخزين المؤقت في قواعد البيانات ، وأكوام من التحسينات والحيل باستخدام الكود. في المجموع ، وهذا يؤدي إلى حقيقة أن المهر فرايز بسرعة الحصان.


يمكن أن يطلق على ناقص بناء جملة الاستعلام في هذا ORM - هو محدد للغاية ، مع استخدام المولدات ، lambdas وغيرها من الكعك لغة بيثون.


 query = select(c for c in Customer if sum(o.total_price for o in c.orders) > 1000) Product.select().order_by(lambda p: desc(sum(p.order_items.quantity))).first() 

هذا النهج يتطلب انهيار معين للدماغ.


السلحفاة orm



عند الخوض في مختلف repos للحيوانات الأليفة ، وجدت مجموعة من اختبارات ORMs المختلفة مع قياسات السرعة. بالإضافة إلى Pony ORM التي سبق ذكرها ، ظهرت لعبة Tortoise ORM في قائمة الأسرع. من الواضح أن نتائج الاختبار تعتمد على من يكتب الاختبارات وطريقة تشغيلها ، ولكن عليك أن تبحث عن كثب في هذا الشيء.


السلحفاة هو مشروع شاب نسبيا ، والذي لا يزال قيد التطوير النشط. يتم تفسير الأداء الجيد لهذه المكتبة من خلال حقيقة أن ORM لا يحتوي على أي شيء غير ضروري وخرج من الصندوق بسبب تشغيله بشكل غير متزامن. ويفترض أيضًا استخدام uvloop ، والذي يعمل بشكل أسرع من دورات piton الأصلية للأحداث.


لا يزال نظام ORM هذا خامًا جدًا بحيث لا يمكن استخدامه في القتال (على سبيل المثال ، حتى يتم تنفيذ تجمعات الاتصال) ، لكن يجب أن تنظر إلى تطور هذا السجل. إذا سارت الأمور على ما يرام مع المطورين ، فسنحصل في السنة القادمة على غلاف سريع لقاعدة البيانات بسرعة جيدة وبدون بناء الجملة الغريب في نمط Pony.

Source: https://habr.com/ru/post/ar460435/


All Articles