Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 类型。