Scala
インストール
Section titled “インストール”build.sbtに追加します。
libraryDependencies += "io.github.edadma" %%% "petradb-engine" % "1.5.0"パッケージ構成
Section titled “パッケージ構成”PetraDBは2つのパッケージに分かれています。
io.github.edadma.petradb— 共有型(Result、Value、Row、TableValue、Sessionトレイト)io.github.edadma.petradb.engine— データベースエンジン(MemoryDB、PersistentDB、TextDB、Session、executeSQL)
エンジンを直接使用するには両方をインポートします。
import io.github.edadma.petradb.*import io.github.edadma.petradb.engine.*インメモリデータベース
Section titled “インメモリデータベース”import io.github.edadma.petradb.*import io.github.edadma.petradb.engine.*
given Session = new MemoryDB().connect()永続データベース
Section titled “永続データベース”import io.github.edadma.petradb.*import io.github.edadma.petradb.engine.*
// 新規作成val db = PersistentDB.create("path/to/db", pageSize = 4096)given Session = db.connect()
// 既存を開くval db = PersistentDB.open("path/to/db")given Session = db.connect()
// 完了時にクローズdb.close()テキストデータベース
Section titled “テキストデータベース”import io.github.edadma.petradb.*import io.github.edadma.petradb.engine.*
val db = TextDB.open("path/to/data.ptxt")given Session = db.connect()
db.close()人間が読める.ptxtファイルです。開くとメモリにロードされ、変更のたびに書き換えます。JVMとNativeで動作します。
SQLの実行
Section titled “SQLの実行”executeSQL(sql: String)(using Session): Seq[Result]
Section titled “executeSQL(sql: String)(using Session): Seq[Result]”1つ以上のセミコロン区切りのSQL文を実行し、結果のシーケンスを返します。
val results: Seq[Result] = executeSQL("SELECT * FROM users")sealed trait Resultcase class QueryResult(table: TableValue) extends Resultcase class InsertResult(obj: Map[String, Value], table: TableValue) extends Resultcase class CreateTableResult(table: String) extends Resultcase class DropTableResult(table: String) extends Resultcase class CreateIndexResult(name: String) extends Resultcase class DropIndexResult(name: String) extends Resultcase class CreateTypeResult(typ: String) extends Resultcase class DropTypeResult(name: String) extends Resultcase class CreateViewResult(name: String) extends Resultcase class DropViewResult(name: String) extends Resultcase class CreateSequenceResult(name: String) extends Resultcase class DropSequenceResult(name: String) extends Resultcase class UpdateResult(rows: Int) extends Resultcase class DeleteResult(rows: Int) extends Resultcase class TruncateResult(table: String) extends Resultcase class AlterTableResult() extends Resultcase class ExplainResult(plan: String) extends Resultcase class PrepareResult(name: String) extends Resultcase class DeallocateResult(name: String) extends Resultcase class CopyResult(rows: Int) extends Resultcase class CreateSchemaResult(name: String) extends Resultcase object BeginResult extends Resultcase object CommitResult extends Resultcase object RollbackResult extends Resultcase object DoBlockResult extends Resultcase class CreateFunctionResult(name: String) extends Resultcase class DropFunctionResult(name: String) extends Resultcase class CreateProcedureResult(name: String) extends Resultcase class DropProcedureResult(name: String) extends Resultcase class CreateTriggerResult(name: String) extends Resultcase class DropTriggerResult(name: String) extends Resultcase object CallResult extends Resultクエリデータへのアクセス
Section titled “クエリデータへのアクセス”val QueryResult(table) = executeQuery("SELECT * FROM users")
// 行へのアクセスval rows: IndexedSeq[Row] = table.data
for (row <- table.data) { val id: Int = row.getInt("id") val name: String = row.getString("name") val email: Option[String] = row.getStringOption("email")}ユーザー定義関数
Section titled “ユーザー定義関数”SQLから呼び出し可能なネイティブScala関数を登録します。トリガーやストアドプロシージャからも使用できます。
db.registerScalarFunction("my_double", { case Seq(v) => NumberValue(v.intValue * 2)}, NumberType)
// SQLで使用可能に:// SELECT my_double(age) FROM users;この方法で登録された関数はどこでも動作します:SELECT、WHERE、DOブロック、ストアド関数、トリガー。
val row: Row = table.data.head
// 型安全な抽出val id: Int = row.getInt("id")val name: String = row.getString("name")val email: Option[String] = row.getStringOption("email")val isActive: Boolean = row.getBoolean("is_active")
// 直接アクセスval value: Value = row("column_name")