ldbc (Lepus Database Connectivity)
ldbcは1.0以前のソフトウェアであり、現在も活発に開発中であることに注意してください。新しいバージョンは以前のバージョンとバイナリ互換性がなくなってしまう可能性があります。
ldbcは、Cats Effect 3とScala 3による純粋関数型JDBCレイヤーを構築するためのライブラリです。
ldbcはTypelevelプロジェクトです。これは、Scalaの行動規範に記載されているように、純粋で、型にはまらない、関数型プログラミングを受け入れ、教育、学習、貢献のための安全でフレンドリーな環境を提供することを意味します。
はじめに
私たちのアプリケーション開発では大抵の場合データベースを使用します。
Scalaでデータベースアクセスを行う場合JDBCを使用する方法がありますが、ScalaにはこのJDBCをラップしたライブラリがいくつか存在しています。
- 関数型DSL (Slick, quill, zio-sql)
- SQL文字列インターポレーター (Anorm, doobie)
ldbcも同じくJDBCをラップしたライブラリであり、ldbcはそれぞれの側面を組み合わせたScala 3ライブラリで型安全でリファクタブルなSQLインターフェイスを提供し、MySQLのデータベース上でのSQL式を表現できます。
ldbcは他のライブラリとは異なり、Scalaで構築された独自のコネクターも提供しています。
Scalaは現在JVM, JS, Nativeというマルチプラットフォームに対応しています。
しかし、JDBCを使用したライブラリだとJVM環境でしか動作しません。
そのためldbcは、MySQLプロトコルに対応したScalaで書かれたコネクタを提供することで異なるプラットフォームで動作できるようにするために開発を行っています。 ldbcを使用することで、Scalaの型安全性と関数型プログラミングの利点を活かしながら、プラットフォームを問わずにデータベースアクセスを行うことができます。
また、ldbcを使用することで単一リソースを管理することでScalaのモデルやsqlのスキーマ、ドキュメントを一元化できる開発を行えることです。
このコンセプトは宣言的でタイプセーフなWebエンドポイントライブラリであるtapirから影響を受けました。tapirを使用することで型安全なエンドポイントを構築することができ、構築したエンドポイントからOpenAPIドキュメントを生成することもできます。
ldbcはデータベース層でScalaを使用して、同じように型安全な構築を可能にし構築されたものを使用してドキュメントの生成を行えるようにします。
対象読者
このドキュメントは、Scalaプログラミング言語を使用してデータベースアクセスを行うためのライブラリであるldbcを使用する開発者を対象としています。
ldbcは、型付けされた純粋な関数型プログラミングに興味がある人のために設計されています。もしあなたがCatsユーザーでなかったり、関数型I/OやモナドCats Effectに馴染みがなかったりする場合は、ゆっくり進める必要があるかもしれません。
とはいえ、もしこのドキュメントやldbc APIに戸惑ったり苛立ったりしたら、issueを発行して助けを求めてください。ライブラリもドキュメントも歴史が浅く、急速に変化しているため、不明瞭な点があるのは避けられません。従って、本書は問題や脱落に対処するために継続的に更新されます。
クイックスタート
現在のバージョンは Scala 3.3.4 に対応した 0.3.0-beta8 です。
libraryDependencies ++= Seq(
// まずはこの1つから
"io.github.takapi327" %% "ldbc-dsl" % "0.3.0-beta8",
// 使用するコネクタを選択
"io.github.takapi327" %% "jdbc-connector" % "0.3.0-beta8", // Javaコネクタ (対応プラットフォーム: JVM)
"io.github.takapi327" %% "ldbc-connector" % "0.3.0-beta8", // Scalaコネクタ (対応プラットフォーム: JVM, JS, Native)
// そして、必要に応じてこれらを加える
"io.github.takapi327" %% "ldbc-query-builder" % "0.3.0-beta8", // 型安全なクエリ構築
"io.github.takapi327" %% "ldbc-schema" % "0.3.0-beta8", // データベーススキーマの構築
)
TODO
- JSONデータタイプのサポート
- SETデータタイプのサポート
- Geometryデータタイプのサポート
- CHECK制約のサポート
- MySQL以外のデータベースサポート
- ストリーミングのサポート
- ZIOモジュールのサポート
- テストキット
- etc...