Coddたたはあなたの斜蚭を信頌したすか

頭痛のない保存枈みオブゞェクトObjectScriptおよびPythonでCachéオブゞェクトを操䜜する簡単な䟋





ノむシュノァンシュタむン城



2020幎6月、正確に50幎間の衚圢匏のデヌタりェアハりス、たたは正匏にはリレヌショナルデヌタモデル。 これは公匏文曞です- 同じ有名な蚘事です。 ゚ドガヌ・フランク・コッド博士に感謝したす。 ずころで、リレヌショナルデヌタモデルは、過去100幎間で最も重芁なグロヌバルむノベヌションのフォヌブスリストに茉っおいたす。



䞀方、奇劙なこずに、CoddはリレヌショナルデヌタベヌスずSQL蚀語を圌の理論の歪んだ実装ず芋なしおいたした。 ガむドラむンずしお、圌はすべおのリレヌショナルデヌタベヌス管理システムが満たす必芁のある12のルヌル実際には13のルヌルを開発したした。 実際、今日、䞖界では少なくずもCoddの「ルヌル0」を満たすDBMSが芋぀からないため、DBMSを100リレヌショナルず呌ぶこずはできたせん:)䟋倖があるかもしれたせん。



リレヌショナルモデルはそれほど耇雑ではなく、党䜓にわたっお研究されおいたす。 さらに深く研究されおいるかもしれたせん。 䞀方、2019幎の今幎はたた別の蚘念日を祝いたす-ちょうど10幎前、NoSQLハッシュタグ、圌は埌に「SQLだけでなく」Twitterに登堎し、デヌタベヌスモデル開発の実践に急速に浞透し始めたした。



なぜそんなに長い玹介ですか プログラミングの䞖界はデヌタおよびもちろんアルゎリズムで構成されおいるずいう事実ず、リレヌショナルモデルの独占的地䜍は、より䞁寧であるため、プログラマヌの分裂意識に぀ながりたす。 開発者の頭にある䜜業オブゞェクトOOPも合蚈ですかのため、これらのリスト、キュヌ、ツリヌ、ヒヌプ、蟞曞、スレッドなどはすべおテヌブルではありたせん。



続けお、最新のDBMSのストレヌゞアヌキテクチャに぀いお芚えおいたすか 率盎に蚀っお、圌らの正しい考えの誰もテヌブルの圢でデヌタを保存したせん。 DBMS開発者は、ほずんどの堎合、さたざたなBツリヌたずえば、PostrgeSQLを䜿甚したす。 䞀方、DBMSを䜿甚しお栌玍するバリケヌドも、非テヌブルで動䜜したす。 そしおこれにより、プログラマヌはセマンティックなギャップず䞍噚甚な䞭間デヌタレむダヌを垞に぀なぐようになりたす。 そしお、それにより、内郚の二分緊匵を匕き起こし、党身の䞍快感ず䞍眠症をデバッグしたす。



぀たり、芁するに矛盟がありたす。デヌタをタスクに適したオブゞェクトにパックし、保存するずきにいく぀かのテヌブルを凊理する必芁がありたす。



絶望 いいえ:)しかし、オブゞェクトリレヌショナルマッピングに぀いおはどうでしょうか。それはORMの䞀般的な話ですか この聖戊を仲間ず共にむゎヌル・ブガ゚ンコに任せたしょう。 そしお、 ボブおじさんによるず 、前䞖玀のこの党䜓の物語は私たちを心配するべきではありたせん 。



もちろん、「バむト付きバッグ」Robert Martin "Clean Architecture"は、シリアル化しおファむルにドロップしたり、他の適切なストリヌムにプッシュしたりできるこずに蚀及する䟡倀がありたす。 しかし、第䞀に、蚀語ですぐに制限され、第二に、DBMSに栌玍するこずだけを心配するようになりたす。



バむトバッグを䜿甚したこれらの浮き沈みには、優れた䟋倖がありたす。むンタヌシステムズCachéDBMSおよび珟圚はむンタヌシステムズIRISデヌタプラットフォヌムです。 これはおそらく、開発者から自明なこずを隠さず、さらに先ぞ進む䞖界で唯䞀のDBMSです。぀たり、「それを正しく保存する方法」を考えるこずから解攟されたす。 クラスがPersistent属を継続し、芁点は垜子、 ぀たりグロヌバル グロヌバル倉数ず混同しないでくださいにあるず蚀うだけで十分です。



文字ストリヌムやバむナリストリヌムなど、あらゆる皮類のデヌタを保存できたす。 以䞋に簡単な䟋を瀺したす。



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





さらに、これは玠晎らしいこずです。CachéネむティブのObjectScriptだけでなく、Python、Java、JavaScript、C ++、C、Perlで盎接オブゞェクトを取埗および保存するこずで、栌玍されたオブゞェクトず通信できたす。 そしお、さらに恐ろしい:)。 SQLク゚リを介しお同じオブゞェクトから盎接情報を取埗するこずもできたす。たた、オブゞェクトで独自のメ゜ッドを呌び出すこずもできたす。 より正確には、この堎合のメ゜ッド自䜓およびマゞックワヌドSqlProcはストアドプロシヌゞャになりたす。 すべおの魔法はすでにCachéDBMSの内郚にありたす。

システム間CachéDBMSぞの無料のテストアクセスを取埗する方法

悪の蚀語が䜕ず蚀っおも、これは絶察に本圓です :) ここで、 Cachéのフル機胜バヌゞョンのシングルナヌザヌをダりンロヌドしおむンストヌルできたす無料で登録する必芁がありたす。 ビルドは、MacOS、Windows、およびLinuxで利甚可胜です。
Eclipseに基づくAtelier IDEを䜿甚しお、ObjectScriptコヌドを操䜜し、CachéDBMSサヌバヌおよびInterSystems IRISプラットフォヌムに盎接アクセスするのが最も䟿利です。 すべおのダりンロヌドおよびむンストヌル手順はこちらです。



より䟿利で銎染みのある人にずっおは、快適でシンプルなVisual Studio Codeを䜿甚でき、コミュニティが開発したObjectScriptプラグむンで補完できたす。



そしお今、いく぀かの実甚的な䟋。 いく぀かの関連オブゞェクトを䜜成しお、ObjectScriptずPythonでそれらを操䜜しおみたしょう。 他の蚀語ずの統合も同様に実装されたす。 Pythonは、ObjectScriptずの「最倧の芪和性」の理由で遞択されたす-䞡方の蚀語はスクリプト可胜で、OOPをサポヌトし、匷い型付けはありたせん:)



䟋のアむデアに぀いおは、掻発なハバロフスクハブロフず混同しないでください「シットアンドゎヌパヌティヌ」フレヌムワヌクのプロゞェクトに目を向けたす。 むデオロギヌの゜ヌスコヌドはgithub.com/Hajsru/framework-weekendにありたす。゜ヌスコヌドはテキストが䜎くなっおいたす。

macOSナヌザヌにずっお重芁なニュアンス。 Pythonのサポヌトモゞュヌルを開始する堎合、CachéをむンストヌルしたディレクトリぞのパスDYLD_LIBRARY_PATHを指定する必芁があるこずを芚えおおく必芁がありたす。 たずえば、次のように

export DYLD_LIBRARY_PATH = / application / Cache / bin$ DYLD_LIBRARY_PATH

これは 、ドキュメントに具䜓的に瀺されおいたす。

ObjectScriptでストアドクラスを䜜成したす



行きたしょう。 Cachéのクラスは非垞に単玔です。 IDEなしでも実行できたす。Cachéプラットフォヌムむンスタンスのポヌタルからクラスコヌドを盎接コピヌしたすはい、CachéDBMSは単なるDBMSにはほど遠いですシステムブラりザ>クラス>むンポヌトネヌムスペヌスUSER。



保存埌、オブゞェクトは察応するクラスの名前ず䞀臎する名前でグロヌブに衚瀺されたす。 たた、Caché管理ポヌタルの[システムブラりザ]> [グロヌバルネヌムスペヌス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; }
      
      





PythonからCachéのオブゞェクトにアクセスする



最初に、CachéDBMSデヌタベヌスに接続したす。 ドキュメンテヌションのように繰り返したす 。

圹に立぀有甚な事実。 無料で、CachéDBMSのトレヌニングバヌゞョンでもありたす。これにより、完党に機胜するバヌゞョンで利甚可胜なすべおを実行できたすが、アクティブな接続は2぀しか蚱可されたせん。 したがっお、同時に、IDEからの接続を維持し、サヌバヌず察話するために他のコヌドを実行しようずするこずはできたせん。 最も簡単な解決策は、Pythonコヌドの実行䞭にIDEを閉じるこずです。
 #   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)
      
      





そしお、ITむベントずその参加者のオブゞェクトデヌタベヌスを䜜成したす。 ずおも簡単です。 1぀目は、むベント参加者に関する情報を登録および保存するためのクラスを䜜成するこずです。 クラスを単玔化するため、メンバヌ名のみ。



 #         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éのオブゞェクトのフィヌルドにアクセスするメ゜ッドに既補のラッパヌ関数を䜿甚したす。setパラメヌタで、パッケヌゞずクラスの名前ずずもに匕甚笊ずopenidでプロパティ名を枡したす。 同様のget関数に぀いおは、以䞋の䟋がありたす。 先祖からクラスによっお継承されたメ゜ッドを含む他のメ゜ッドにアクセスするには、必芁に応じおメ゜ッド名ず呌び出しパラメヌタヌでrun_obj_method関数を䜿甚したす。



行の䞭で最も重芁な魔法self.att.run_obj_method "Save"、[]

これにより、ナビキタスで芋苊しいORMなどの远加のラむブラリやフレヌムワヌクを䜿甚せずに、オブゞェクトを盎接参照しお保存するこずができたす。



さらに、ObjectScriptのオブゞェクト指向の性質ずそのクラスのメ゜ッドこの䟋では実行したせんでしたを考えるず、Persistentクラスずその祖先から継承されたメ゜ッドセット党䜓ぞのPythonアクセスからボヌナスが埗られたす。 完党なリストは次のずおりです。



最初のメンバヌを䜜成したす。



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





このコヌドを実行するず、FW.AttendeeDずいう名前のグロヌバルがデヌタベヌスに衚瀺され、スクリヌンショットのように保存したばかりのオブゞェクトの内容が衚瀺されたす。







保存埌、このオブゞェクトは独自のID番号1を持ちたす。 したがっお、このIDを䜿甚しおプログラムに読み蟌むこずができたす。



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





そしお、必芁に応じお、再びidを知っお、参加者デヌタベヌスからオブゞェクトを削陀できたす。



 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)
      
      





したがっお、これらの䟋は、デヌタモデルずその衚圢匏のストレヌゞスキヌムに぀いお同時に考える必芁がないこずを瀺しおいたす。 より明確なツヌルをタスクに䜿甚できたす。



Pythonや他の蚀語でCachéを接続しお䜿甚するための詳现な手順は、ドキュメントおよびInterSystems開発者コミュニティポヌタルでい぀でも利甚できたす-これは、 community.intersystems.comの 5,000人以䞊のメンバヌです。

ヘルプInterSystemsCachéマルチモデルDBMSは、 オブゞェクトデヌタベヌスの氞続的な䞖界的リヌダヌです。








All Articles