الثقة كود أو المرافق الخاصة بك؟

كائنات مخزنة خالية من الصداع: مثال بسيط للعمل مع كائنات Caché في ObjectScript و Python



قلعة نويشفانشتاين

في حزيران (يونيو) 2020 ، أي 50 عامًا بالضبط من مستودعات البيانات المجدولة أو نموذج البيانات العلائقية رسميًا. إليك وثيقة رسمية - نفس المقال الشهير . التي نقول شكرا جزيلا للدكتور إدغار فرانك كود. وبالمناسبة ، فإن نموذج البيانات العلائقية مدرج في قائمة فوربس لأهم الابتكارات العالمية في المائة عام الماضية.

من ناحية أخرى ، من الغريب أن كود اعتبر قواعد البيانات العلائقية ولغة SQL تطبيقًا مشوهًا لنظريته. كدليل ، قام حتى بتطوير 12 قاعدة يجب أن يلبيها كل نظام لإدارة قواعد البيانات العلائقية (في الواقع ، هناك 13 قاعدة). وفي الحقيقة ، اليوم ، في العالم ، لا يمكنك العثور على قواعد بيانات قواعد البيانات التي ترضي كود قاعدة "كود 0" على الأقل ، وبالتالي ، لا يمكن لأحد الاتصال بـ قواعد بيانات قواعد البيانات بنسبة 100٪ :) ربما هناك استثناءات ، أخبرني؟

نموذج العلائقية ليس معقدًا جدًا ويتم دراسته على طول الطريق. قد تكون مدروسة بعمق. وفي الوقت نفسه ، في عام 2019 ، سنحتفل أيضًا بالذكرى السنوية الأخرى - قبل 10 سنوات بالضبط ، ظهرت علامة التجزئة #NoSQL لاحقًا على "ليس فقط SQL" على Twitter وبدأت تغلغلها السريع في ممارسة تطوير نماذج قواعد البيانات.

لماذا هذه مقدمة طويلة؟ إلى حقيقة أن كون البرمجة يتكون من البيانات (والخوارزميات بالطبع) ، والموقف الاحتكاري للنموذج العلائقي يؤدي ، كما هو أكثر مهذبة أن نقول ، وعي تقسيم للمبرمج. نظرًا لأن كائنات العمل في رأس المطور (OOP أيضًا كليًا ، صحيح؟) ، فإن كل هذه القوائم ، والقوائم ، والأشجار ، والأكوام ، والقواميس ، والموضوعات ، وغير ذلك ، ليست جداول.

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

هذا ، باختصار ، هناك تناقض - فنحن نجمع البيانات في كائنات مناسبة للمهمة ، وعند حفظها يجب أن نراعي بعض الجداول.

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

بالطبع ، تجدر الإشارة إلى أن "الحقيبة ذات البايتات" (Robert Martin "Pure Architecture") يمكن تسلسلها وإسقاطها في ملف أو دفعها إلى دفق مناسب آخر. ولكن ، أولاً ، سيحدنا على الفور من اللغة ، وثانياً ، الآن سنقلق فقط بشأن التخزين في قواعد بيانات إدارة قواعد البيانات.

هناك استثناء لطيف لهذه الصعود والهبوط مع أكياس البايت - Intersystems Caché DBMS (والآن منصة بيانات InterSystems IRIS). ربما هذا هو نظام إدارة قواعد البيانات الوحيد في العالم الذي لا يخفي ما هو واضح من المطور وحتى أنه أبعد من ذلك - فهو يحرر المرء من التفكير في "كيفية تخزينه بشكل صحيح". يكفي أن نقول إن الطبقة تواصل جنسها المستمر والنقطة في القبعة ، أي في العالم (لا يجب الخلط بينها وبين المتغيرات العالمية!).

يمكن تخزين جميع أنواع البيانات ، بما في ذلك التدفقات الشخصية والحروف الثنائية. هنا مثال بسيط:

//       - // :      ,     ,     , ,   Class FW.Events Extends %Persistent { Property "My name" As %String; } //      //   «»  set haJS = ##class(FW.Events).%New() //   write haJS.%Id() 

علاوة على ذلك ، وهذا شيء رائع ، يمكنك التواصل مع الكائنات المخزنة ليس فقط في ObjectScript ، موطن Caché ، ولكن في استرجاعها وتخزينها مباشرة في Python و Java و JavaScript و C ++ و C # و Perl. وحتى يا الرعب :). من الممكن أيضًا الحصول على معلومات من نفس الكائنات مباشرةً من خلال استعلامات SQL ، ومن الممكن أيضًا استدعاء الأساليب الخاصة بك على الكائنات. بتعبير أدق ، الطرق في هذه الحالة من تلقاء نفسها (وكلمة سحرية SqlProc) تتحول إلى الإجراءات المخزنة. كل السحر موجود بالفعل تحت غطاء Caché DBMS.
كيفية الحصول على اختبار مجاني للوصول إلى Intersystems Caché DBMS؟
هذا حقيقي تمامًا ، بغض النظر عما تقوله اللغات الشريرة! :) يمكنك تنزيل وتثبيت النسخة الكاملة الميزات لمستخدم واحد من Caché هنا (ستحتاج إلى التسجيل مجانًا). تتوفر عمليات الإنشاء لنظام التشغيل MacOS و Windows و Linux.
من الأنسب التعامل مع كود ObjectScript والوصول المباشر مباشرةً إلى خادم Caché DBMS (ومن نظام InterSystems IRIS أيضًا) باستخدام Atelier IDE ، والذي يعتمد على Eclipse. جميع تعليمات التحميل والتثبيت هنا .

لمن هو أكثر ملاءمة ومألوفة ، يمكنك استخدام Visual Studio Code المريح والبسيط ، مع استكماله مع الأداة الإضافية ObjectScript التي طورها المجتمع.

والآن بعض الأمثلة العملية. دعونا نحاول إنشاء اثنين من الكائنات ذات الصلة والعمل معهم في ObjectScript و Python. يتم تطبيق التكامل مع اللغات الأخرى بشكل مشابه. يتم اختيار Python لأسباب "أقصى درجة التقارب" مع ObjectScript - كلتا اللغتين قابلة للبرمجة ، ودعم OOP وليس لديهم كتابة قوية :)

للحصول على أفكار للحصول على أمثلة ، ننتقل إلى مشاريع خاباروفسك القوية (لا ينبغي الخلط بينها وبين خاباروفسك!) مشاريع "إطار عمل التجمع". كود المصدر الإيديولوجي يكمن في github.com/Hajsru/framework-weekend ورمز مصدرنا أقل في النص.
فارق بسيط مهم لمستخدمي ماك. عند بدء تشغيل وحدات الدعم لبرنامج Python ، يجب أن تتذكر أنك بحاجة إلى تحديد المسار DYLD_LIBRARY_PATH إلى الدليل الذي قمت بتثبيت Caché به. على سبيل المثال ، مثل هذا:
تصدير DYLD_LIBRARY_PATH = / application / Cache / bin: $ DYLD_LIBRARY_PATH
يشار إلى هذا على وجه التحديد في الوثائق.

نخلق الطبقات المخزنة على ObjectScript


لذلك دعونا نذهب. ستكون الفصول في Caché بسيطة للغاية. يمكنك الاستغناء عن IDE - قم بنسخ رمز الفصل مباشرة من خلال مدخل مثيل النظام الأساسي Caché (نعم ، Caché DBMS بعيدًا عن DBMS فقط): متصفح النظام> الفئات> استيراد (Namespace USER).

بعد الحفظ ، ستظهر الكائنات في الكرات الأرضية بأسماء تطابق أسماء الفئات المطابقة. انظر أيضًا في مدخل إدارة Caché: System Browser> Globals (Namespace USER).

 //    , ,      Class FW.Event Extends %Persistent { Property title as %String; Property description as %String; Property date as %Date; Property visitors as list of FW.Attendee; } //    / Class FW.Attendee Extends %Persistent { Property name As %String; } 

الوصول إلى الكائنات في Caché من Python


أولاً ، قم بالاتصال بقاعدة بيانات Caché DBMS. نكرر كما في الوثائق .
مجرد حقيقة مفيدة للعمل معها. مجانًا ، إنها أيضًا إصدار تدريبي من Caché DBMS ، والذي سيتيح لك القيام بكل ما هو متاح في الإصدار الوظيفي بالكامل ، ولكنه يسمح فقط باتصالين نشطين. لذلك ، في الوقت نفسه ، لن يكون من الممكن الاحتفاظ بالاتصال من IDE ومحاولة تشغيل تعليمات برمجية أخرى للتفاعل مع الخادم. الحل الأبسط الذي تم العثور عليه هو إغلاق IDE أثناء تشغيل شفرة Python.
 #   Caché    Python3 import intersys.pythonbind3 #    conn = intersys.pythonbind3.connection() conn.connect_now("localhost[1972]:USER","_SYSTEM","SYS", None) #    print ("conn = %d " % conn.handle) #     database = intersys.pythonbind3.database(conn) 

والآن سنقوم بإنشاء قاعدة بيانات كائن لأحداث تكنولوجيا المعلومات والمشاركين فيها. بسيط جدا جدا الأول هو إنشاء فصل لتسجيل وتخزين المعلومات حول مشارك الحدث. للبساطة في الفصل ، اسم العضو فقط.

 #         class Attendee: #        def __init__ (self): self.att = database.create_new("FW.Attendee", None) #             id def new (self, name): self.att.set("name", name) self.att.run_obj_method("%Save",[]) #    id     def use (self, id): self.att = database.openid("FW.Attendee",str(id),-1,-1) #       def clean (self): id = self.att.run_obj_method("%Id",[]) self.att.run_obj_method("%DeleteId", [id]) 

كما ترون ، نحن نستخدم دالات المجمع الجاهزة لطرق الوصول إلى حقول الكائنات في Caché: قم بتعيين وفي المعلمات نقوم بتمرير اسم الخاصية في علامات اقتباس ونفتح مع اسم الحزمة والفئة. حول وظيفة الحصول على مماثلة ، هناك أمثلة أدناه. للوصول إلى أي طرق أخرى ، بما في ذلك تلك التي ورثها الفصل من أسلافهم ، استخدم الدالة run_obj_method () مع اسم الأسلوب ومعلمات الاتصال ، إذا لزم الأمر.

السحر الأكثر أهمية في السطر: self.att.run_obj_method ("٪ Save"، [])
هذه هي الطريقة التي لدينا بها القدرة على حفظ الكائنات ذات المرجع المباشر ودون الحاجة إلى استخدام مكتبات وأطر عمل إضافية ، مثل ORMs في كل مكان والقبيح.

بالإضافة إلى ذلك ، نظرًا لطبيعة ObjectScript الموجهة نحو الكائنات ، بالإضافة إلى أساليب فئتها (في مثالنا ، لم نقم بذلك) ، نحصل على مكافأة من Python للوصول إلى مجموعة كاملة من الطرق الموروثة من الفئة الثابتة وأسلافها. هنا قائمة كاملة ، إذا كان ذلك.

إنشاء العضو الأول:

 att = Attendee() att.new("") 

بعد تشغيل هذا الرمز ، ستظهر علامة عمومية في قاعدة البيانات باسم FW.AttendeeD ومحتويات الكائن المحفوظ للتو كما في لقطة الشاشة:



بعد الحفظ ، يكون لهذا الكائن معرفه الخاص (برقم 1). لذلك ، يمكنك تحميله في برنامجنا باستخدام هذا المعرف:

 att = Attendee() att.use(1) print (att.att.get("name")) 

والآن ، مع معرفتك مرة أخرى ، إذا لزم الأمر ، يمكنك حذف الكائن من قاعدة بيانات المشاركين:

 att = Attendee() att.use(1) att.clean() 

تحقق ، بعد تشغيل هذا المثال ، يجب أن يختفي السجل الخاص بالكائن في السجل العام. على الرغم من أن البيانات التي تم تنزيلها لا تزال "في ذاكرة" الكائن الخاص بك حتى يتم إنهاء البرنامج.

لنأخذ الخطوة التالية. إنشاء سجلات الأحداث الفعلية.

 #        class Event: #        def __init__ (self): self.event = database.create_new("FW.Event", None) #            id def new (self, title, desc, date): self.event.set("title", title) self.event.set("description", desc) self.event.set("date", date) self.event.run_obj_method("%Save",[]) #    id    def use (self, id): self.event = database.openid("FW.Event",str(id),-1,-1) #       def addAttendee (self, att): eventAtt = self.event.get("visitors") eventAtt.run_obj_method("Insert", [att]) self.event.set("visitors", eventAtt) self.event.run_obj_method("%Save",[]) #      def clean (self): id = self.event.run_obj_method("%Id",[]) self.event.run_obj_method("%DeleteId", [id]) 

هيكل الفصل هو نفسه تقريبا كما هو موضح أعلاه بالنسبة لعضو الفصل. الأهم من ذلك ، ظهرت طريقة لإضافة المشاركين إلى قائمة المشاركين لهذا الحدث addAttendee (att).

نحاول إنشاء سجل كائن حول حدث جديد وحفظه في قاعدة البيانات:

 haJS = Event() haJS.new("haJS", " ", "2019-01-19") 

يجب أن يتحول شيء من هذا القبيل (لاحظ أن التاريخ يتم تحويله تلقائيًا إلى تنسيق ObjectScript وعند إعادة تحميله مرة أخرى في كائن Python ، سيعود إلى التنسيق الأصلي):



يبقى لإضافة المشارك إلى الحدث:

 #     haJS = Event() haJS.use(1) #    att = Attendee() att.new("") #      haJS.addAttendee(att.att) 

لذلك ، توضح هذه الأمثلة أنه ليس من الضروري التفكير في نفس الوقت في نموذج البيانات ونظام التخزين الجدولي الخاص به. يمكنك استخدام أدوات أكثر وضوحًا لمهامك.

الإرشادات التفصيلية للاتصال واستخدام Caché مع Python واللغات الأخرى متاحة لك دائمًا في الوثائق وعلى بوابة مجتمع مطوري InterSystems - وهذا لا يقل عن 5000 عضو في community.intersystems.com
مساعدة: InterSystems Caché multimodel DBMS تظل الرائدة عالميا في قواعد بيانات الكائنات


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


All Articles