Skip to content

wflixu/Orion

Repository files navigation

Orion

Derive + Codegen 类型安全的数据访问层 for MoonBit

Orion 是一个采用 Mapper 模式的数据库访问层,灵感来自 Prisma、Drizzle 和 SeaORM。

Orion = Derive + Codegen + 类型安全 + Mapper 模式 + 工程化

特性

  • 🔧 Derive + Codegen - 声明式 schema 定义,自动生成 Struct + CRUD + Query Builder
  • 🔒 类型安全 - 编译时类型检查,运行时类型转换
  • 🗺️ Mapper 模式 - 一个表对应一个 Mapper
  • 🛠️ CLI 工具链 - Schema 代码生成、迁移管理
  • 🚀 MoonBit 原生 - 编译为 native,使用 C runtime

快速开始

安装

moon add wflixu/Orion

定义 Schema

创建 Schema 文件 schema/user.mbt

import wflixu/Orion.{schema, pk_auto_inc, required, unique_required}

let user_schema = schema("users")
  |> add_int_field("id", pk_auto_inc())
  |> add_string_field("name", required())
  |> add_string_field("email", unique_required())
  |> add_int_field("age", [])
  |> build_schema()

生成代码

orion schema ./schema

生成的代码包含:

  • struct Users with derive(Eq, Hash, FromJson, ToJson, Show)
  • struct UsersMapper
  • CRUD 函数:create_users, find_users_by_id, find_all_users, update_users, delete_users_by_id
  • Query Builder:链式查询构建
// generated/users.mbt
// @generated by Orion v0.2.0

pub struct Users {
  id: Int,
  name: String,
  email: String,
  age: Int
} derive(Eq, Hash, FromJson, ToJson, Show)

pub struct UsersMapper { db: @runtime.Db }

pub fn create_users(self: UsersMapper, name: String, email: String, age: Int) -> Result[Int, @runtime.DbError]
pub fn find_users_by_id(self: UsersMapper, id: Int) -> Result[Option[Users], @runtime.DbError]
pub fn find_all_users(self: UsersMapper) -> Result[List[Users], @runtime.DbError]

// Query Builder
pub fn new_users_query(db: @runtime.Db) -> UsersQuery
pub fn UsersQuery::where_name(self, value: String) -> Self
pub fn UsersQuery::execute(self) -> Result[List[Users], @runtime.DbError]

使用示例

import wflixu/Orion

fn main {
  // 连接数据库
  let db = Orion.connect({
    url: "sqlite://app.db",
    pool_size: 10
  })
  
  // 创建 Mapper
  let user_mapper = UserMapper::new(db)
  
  // 查询用户
  match user_mapper.get_user_by_id(1) {
    Some(user) => println("User: \(user.name)")
    None => println("User not found")
  }
  
  // 创建用户
  let user_id = user_mapper.create_user("Alice", 25)?
  
  // 启用日志
  Orion.enable_log(db, Debug)
}

项目结构

my-project/
├── schema/            # Schema 文件目录
│   ├── user.mbt
│   └── order.mbt
├── generated/         # 生成的代码
│   ├── user.mbt
│   └── order.mbt
├── main.mbt           # 你的代码
└── moon.mod.json

CLI 命令

Schema 代码生成

# 生成 Schema 代码
orion schema ./schema

# 指定输出目录
orion schema ./schema --output ./generated

数据库迁移(v0.2.1)

# 创建新迁移
orion migrate create add_users_table

# 应用迁移
orion migrate up

# 回滚迁移
orion migrate down

# 查看迁移状态
orion migrate status

运行时 API

连接管理

// 基本连接
let db = Orion.connect({
  url: "sqlite://app.db"
})

// 连接池配置
let db = Orion.connect({
  url: "sqlite://app.db",
  pool_size: 10,
  query_timeout: 5000  // 毫秒
})

// 启用日志
Orion.enable_log(db, level: Debug)

// 关闭连接
Orion.close(db)

事务(v0.2.1)

Orion.transaction(db, fn(tx) {
  let user_id = UserMapper.create(tx, "Alice", 25)?
  OrderMapper.create(tx, user_id, 100)?
  Ok(unit)
})

错误处理

///|
enum DbError {
  NotFound // 未找到记录
  UniqueViolation // 唯一约束违反
  ConnectionError // 连接错误
  QueryError // 查询错误
  Timeout // 超时
}

数据库支持

数据库 状态 版本
SQLite ✅ 已支持 v0.2.0
PostgreSQL 🔄 开发中 v0.2.1
MySQL 📅 计划中 v0.2.2

版本规划

  • v0.2.0 - Derive + Codegen ORM(Schema DSL + Codegen 2.0 + Query Builder)✅
  • v0.2.1 - 生产就绪(事务 + Migration + PostgreSQL)
  • v0.2.2 - 增强特性(高级 Query Builder + MySQL)
  • v0.2.3+ - 未来规划(关系定义 + 反向生成)

详见 specs/prd.mdspecs/design.md

架构

┌─────────────────────┐
│    Orion CLI        │
│   (schema/migrate)  │
└──────────┬──────────┘
           │
┌──────────▼──────────┐
│    Schema DSL       │
│   (*.mbt files)     │
└──────────┬──────────┘
           │
┌──────────▼──────────┐
│   Codegen 2.0      │
│ (Struct+CRUD+QB)   │
└──────────┬──────────┘
           │
┌──────────▼──────────┐
│   Orion Runtime     │
│   (pool/tx/log)    │
└──────────┬──────────┘
           │
     ┌─────▼─────┐
     │ Database  │
     └───────────┘

开发

# 克隆项目
git clone https://github.com/wflixu/Orion.git
cd Orion

# 格式化代码
moon fmt

# 运行检查
moon check

# 运行测试
moon test

# 更新快照
moon test --update

# 更新包接口并格式化
moon info && moon fmt

# 覆盖率分析
moon coverage analyze > uncovered.log

Git Hooks

# 配置 pre-commit hook
chmod +x .githooks/pre-commit
git config core.hooksPath .githooks

对比

特性 Orion Prisma Drizzle SeaORM
Derive + Codegen
Schema DSL
类型安全
Query Builder
CLI 工具链 ⚠️
MoonBit 原生

许可证

MIT License - 详见 LICENSE 文件

相关链接

致谢

感谢以下社区项目:

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors