Rust:sea-orm的两个小tips——错误处理 & 只查询部分字段

错误处理

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清空要查询的列,然后使用columncolumns来逐步添加要查询的列。

如果被忽略的列是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?;
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值