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/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 Userswithderive(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
# 生成 Schema 代码
orion schema ./schema
# 指定输出目录
orion schema ./schema --output ./generated# 创建新迁移
orion migrate create add_users_table
# 应用迁移
orion migrate up
# 回滚迁移
orion migrate down
# 查看迁移状态
orion migrate status// 基本连接
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)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.md 和 specs/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# 配置 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 文件
感谢以下社区项目: