Scala
build.sbt에 추가합니다:
libraryDependencies += "io.github.edadma" %%% "petradb-engine" % "1.5.0"패키지 구조
섹션 제목: “패키지 구조”PetraDB는 두 패키지로 나뉩니다:
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.*인메모리 데이터베이스
섹션 제목: “인메모리 데이터베이스”import io.github.edadma.petradb.*import io.github.edadma.petradb.engine.*
given Session = new MemoryDB().connect()영구 데이터베이스
섹션 제목: “영구 데이터베이스”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()텍스트 데이터베이스
섹션 제목: “텍스트 데이터베이스”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 실행
섹션 제목: “SQL 실행”executeSQL(sql: String)(using Session): Seq[Result]
섹션 제목: “executeSQL(sql: String)(using Session): Seq[Result]”세미콜론으로 구분된 하나 이상의 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쿼리 데이터 접근
섹션 제목: “쿼리 데이터 접근”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")}사용자 정의 함수
섹션 제목: “사용자 정의 함수”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")