错误处理
Error Handling | SeaORM 🐚 An async & dynamic ORM for Rust
数据库约束的错误都是SqlErr
SqlErr in sea_orm::error - Rust,可以在DbErr
对象上调用sql_err()
进行转化(不需要DbErr
的所有权)。因此可以将重复键检测封装成函数:
// 不关心重复了什么键的话可以直接去掉String返回,变成Result<(), DbErr>
pub fn check_duplicate_key_error(e: DbErr) -> Result<String, DbErr> {
let sql_err = e.sql_err();
match sql_err {
Some(sql_err) => {
if let SqlErr::UniqueConstraintViolation(msg) = sql_err {
return Ok(msg);
}
Err(e)
},
None => {
Err(e)
}
}
}
然后就可以使用map_err
快速处理:
// TYPE: Result<Model, Result<String, DbErr>>
let add_pin_res = new_pin.insert(&state.db_conn).await
.map_err(services::db::check_duplicate_key_error);
Partial Select
可以使用select_only
清空要查询的列,然后使用column
和columns
来逐步添加要查询的列。
如果被忽略的列是not null的话,整个查询都只会返回Query(SqlxError(ColumnNotFound("peer_id")))
。
使用into_partial_model
,结合实现了DerivePartialModel
的struct来进行partial select,不需要手动select_only
了:
#[derive(DerivePartialModel, FromQueryResult)]
#[sea_orm(entity = "Node")]
#[allow(dead_code)]
struct PartialNode {
pub rpc_address: String,
}
let models = Node::find_by_id(node_id)
.into_partial_model::<PartialNode>()
.one(&db_conn).await?;