A lightweight MoonBit ORM with typed queries, code generation, and multi-database engines
Dependencies
{
"bin-deps": {
"oboard/morm": "latest"
}
}import {
"oboard/morm",
"oboard/morm/engine" @morm/engine,
}options(
"pre-build": [
{
"command": "$mod_dir/.mooncakes/oboard/morm/morm-gen $input -o $output && moonfmt -w $output",
"input": "entities.mbt",
"output": "entities.g.mbt",
},
{
"command": "$mod_dir/.mooncakes/oboard/morm/morm-gen $input -o $output && moonfmt -w $output",
"input": "mapper.mbt",
"output": "mapper.g.mbt",
},
],
)///|
using @time {type PlainDateTime}
///|
#mormentity
pub(all) struct Class {
#mormid
#mormdefault(autoincrement())
id : Int64
#mormvarchar(length="255")
name : String
created_at : PlainDateTime
updated_at : PlainDateTime
} derive(ToJson, FromJson)///|
#mormmapper(table="class")
pub trait ClassMapper {
async save(Self, entity : Class) -> Class
}
///|
#mormmapper(table="student")
pub trait StudentMapper {
async find_student_by_id(Self, id : Int) -> Student?
async find_student_by_name(Self, name : String) -> Student?
async find_students_by_age(Self, age : Int) -> FixedArray[Student]
}let q = @morm.select_from("class")
.where_eq("id", 1)
.order_by(@morm.desc("id"))
.limit(1)let res = engine.exec(q)let pageable = @morm.pageable_with_sort(1, 20, @morm.desc("id"))
let q = @morm.select_from("student")
.where_gte("age", 18)
let page = @morm.paginate(
engine,
q,
pageable,
)let page = @morm.paginate_raw(
engine,
"SELECT id, name, age FROM student WHERE age >= ?",
[18],
@morm.pageable(2, 10),
)@morm.auto_migrate(engine, [Class::table()])pub(open) trait Driver {
fn open(Self, dsn : String) -> Result[Self, DbError]
fn close(Self) -> Result[Self, DbError]
fn ping(Self) -> Result[Unit, DbError]
fn exec(Self, sql : String, args : FixedArray[Param]) -> Result[Unit, DbError]
fn query(Self, sql : String, args : FixedArray[Param]) -> Result[FixedArray[Json], DbError]
}pub(all) struct Association {
name : String
kind : AssociationKind
owner_key : String
target_table : String
target_key : String
join_table : String?
join_owner_key : String?
join_target_key : String?
} derive(Eq, ToJson, FromJson)impl Show for Associationimpl Show for AssociationKindimpl Show for DeleteQueryimpl QueryBuilder for DeleteQueryfn[E : Entity + ToJson + FromParam] DeleteQuery::from(self : DeleteQuery, entity : E) -> DeleteQueryfn[V : ToParam] DeleteQuery::where_like(self : DeleteQuery, col : String, pattern : V) -> DeleteQuerypub(all) struct ForeignKeyDiff {
added : FixedArray[ForeignKey]
removed : FixedArray[ForeignKey]
changed : FixedArray[(String, ForeignKey, ForeignKey)]
} derive(Eq, ToJson, FromJson)impl Show for ForeignKeyDiffimpl Show for InsertQueryimpl QueryBuilder for InsertQueryfn[E : Entity + ToJson + FromParam] InsertQuery::from(self : InsertQuery, entity : E) -> InsertQueryfn[E : Entity + ToJson + FromParam] InsertQuery::from_many(self : InsertQuery, entities : FixedArray[E]) -> InsertQueryfn InsertQuery::values_many(self : InsertQuery, rows : FixedArray[FixedArray[&ToParam]]) -> InsertQueryimpl QueryBuilder for Querypub(all) struct TableDiff {
columns : ColumnDiff
indexes : IndexDiff
foreign_keys : ForeignKeyDiff
} derive(Eq, ToJson)pub struct TxBatch[E] {
engine : E
}async fn[E : Engine] TxBatch::rollback_to_savepoint(self : TxBatch[E], name : String) -> QueryResultimpl Show for UpdateQueryimpl QueryBuilder for UpdateQueryfn[E : Entity + ToJson + FromParam] UpdateQuery::from(self : UpdateQuery, entity : E) -> UpdateQueryfn[V : ToParam] UpdateQuery::where_like(self : UpdateQuery, col : String, pattern : V) -> UpdateQueryimpl Show for UpsertQueryimpl QueryBuilder for UpsertQueryfn[E : Entity + ToJson + FromParam] UpsertQuery::from(self : UpsertQuery, entity : E) -> UpsertQueryfn[T] before_create(entity : T, callback : (T) -> T) -> Tfn belongs_to(name : String, owner_key : String, target_table : String, target_key : String) -> Associationfn has_many(name : String, owner_key : String, target_table : String, target_key : String) -> Associationfn has_one(name : String, owner_key : String, target_table : String, target_key : String) -> Associationfn many_to_many(name : String, owner_key : String, target_table : String, target_key : String, join_table : String, join_owner_key : String, join_target_key : String) -> Associationfn new_foreign_key(name : String, column : String, referenced_table : String, referenced_column : String) -> ForeignKeyasync fn[E : Engine, T : FromParam] paginate(engine : E, query : &QueryBuilder, pageable : Pageable) -> Page[T]async fn[E : Engine, O : ToJson, T : FromParam] preload(engine : E, owners : FixedArray[O], association : Association) -> PreloadResult[T]fn register_driver_scheme(scheme : String, driver_name : String) -> Unitfn[V : ToParam] restore_by_id(table : String, id_col : String, id : V, deleted_col? : String) -> UpdateQueryfn[V : ToParam] soft_delete_by_id(table : String, id_col : String, id : V, deleted_col? : String) -> UpdateQueryA lightweight MoonBit ORM with typed queries, code generation, and multi-database engines
Dependencies