Repository 与查询
获取已注册模型的 Repository:
let users = orm.repo::<User>()?;
let mut user = User {
id: None,
email: "ada@example.com".to_owned(),
display_name: "Ada".to_owned(),
deleted_at: None,
version: 0,
};
users.insert(&mut user).await?;
let loaded = users.find_by_id(user.id.expect("generated ID")).await?;
Repository 持有 ORM 连接上下文,因此操作不需要额外传入连接池。API 包括插入、保存、更新、
按主键查找、条件/列表/计数查询、软删除恢复和物理删除。模型必须先通过
Orm::with_models 注册。
模型查询
derive 为模型字段生成 ModelField<T> 代理,比较操作的值类型与字段 Rust 类型一致;对于
Option<T> 字段,比较方法接收 T。声明 #[orm(soft_delete)] 后,查询构造器会自动添加
删除标记为 NULL 的条件。
let statement = users
.query()
.filter(User::email.like(String::from("%@example.com")))
.filter(User::id.gte(1_i64))
.order_by(User::email.asc())
.limit(20)
.offset(0)
.build()?;
let page: Vec<User> = users.fetch_all(&statement).await?;
支持 eq、ne、gt、gte、lt、lte 和 like 比较;条件可用 and、or 组合。字段
还支持 is_null、is_not_null、is_true,排序支持 asc() 和 desc()。Rust 条件类型不保证
数据库列一定支持对应操作符。
已知列名但需要动态条件时可使用 Field::new("column")。select 和 order_by_name 接收字符串
列名;构建 SQL 时会验证标识符,运行时值则作为绑定参数传递。
原始 SQL
Repository 查询构造器之外的开发者编写 SQL 可使用 Orm::query 或 query_as。请绑定运行时
数据,不要通过字符串插值拼接:
let matching: Vec<User> = orm
.query_as("SELECT id, email, display_name, deleted_at, version FROM users WHERE email = ?")
.bind("ada@example.com")
.fetch_all()
.await?;
SQL 语句为静态字符串,参数独立绑定。? 占位符会为 PostgreSQL 重写,PostgreSQL JSON 操作符会
保留。数组和范围用法见PostgreSQL 类型,SQLite 映射见SQLite 类型。