すみません。 Scala向けの新しいエレガントでスケーラブルなORMフレームワーク

ScalaのORMの選択に対処しなければならなかった人は、おそらくSlick(Scala Query)、Squeryl、Circumflexなどのライブラリについて聞いたことがあるでしょう。 、彼らは特定の方法でモデルの説明を必要とし、APIはしばしば混乱して分散し、そして最後に、これらのライブラリによって提供される抽象化がデータベースとの作業を本当に単純化する程度は少なくとも疑わしいです。



だから、そのアイデアは、フレームワークを作成するために生まれました

  1. データベースの抽象化をより高いレベルに引き上げ、標準のScalaデータ型(プリミティブ、タプル、オプション、コレクションなど)、およびエンティティである標準ケースクラスを通じて提示します。
  2. 最初のタスクの実行は「クリーン」になります。これは、フレームワークAPIからリレーショナル側の概念を完全に除外することを意味します。テーブル、行、リレーショナル関係はありません。
  3. 関数型プログラミングの原則を高めます。変更不可能なデータ型のみ、状態を最小化し、
  4. ユーザーにできる限りのことをすべて実行します。


ご覧のとおり、タスクはすべて妥協することはありませんでしたが、解決されました。 このため、一貫性、シンプルさ、および結果として得られるフレームワークの直感性を実現することができました-これは決して弱い機会ではありません。 定型文は完全に除外されました。 次はコードです。



//  . //  ,      .   // -,         - //  ,   view. case class Artist ( name : String, genres : Set[Genre] ) case class Genre ( name : String ) //   .   SORM   : import sorm._ object Db extends Instance ( entities = Set() + Entity[Artist]() + Entity[Genre](), url = "jdbc:h2:mem:test" ) //     : val metal = Db.save( Genre("Metal") ) val rock = Db.save( Genre("Rock") ) Db.save( Artist("Metallica", Set() + metal + rock) ) Db.save( Artist("Dire Straits", Set() + rock) ) //  -: // Option[Artist]: val metallica = Db.query[Artist].whereEqual("name", "Metallica").fetchOne() // Stream[Artist]: val rockArtists = Db.query[Artist].whereEqual("genres.item.name", "Rock").fetch()
      
      





それは言われている、それはすべての人々です! これは、データベースを作成し、そこからエンティティを保存および取得するプログラムの完全なコードです。 操作性のためにユーザー側で追加のアクションは必要ありません。



インストール情報、ドキュメント、チュートリアル、およびSlick(Scala Query)との比較は、 SORM公式Webサイトにあります。



ネタバレ:マクロはSORMの将来のバージョンで登場し、APIの簡素化はさらに進んでいます。



All Articles