繁体   English   中英

rust、柴油和 mysql:如何返回拥有的记录?

[英]rust, diesel and mysql: how to return an owned record?

实际上我正在返回一个克隆的结构

pub fn matrix_first_or_create(&self, schema: String, symbol: String) -> RewardMatrix {

    ....

    let rewards = reward_matrix
        .filter(state.eq(schema.clone()))
        .filter(turn_symbol.eq(symbol.clone()))
        .limit(1)
        .load::<RewardMatrix>(&self.connection)
        .expect("Error loading posts");

    if rewards.len() > 0 {
        return rewards.get(0).unwrap().clone();
    }

    ....
}

这是处理 rust + 柴油结果的正确方法吗?

我可以“提取”并拥有此查询的第一个也是唯一一个结果吗?

您在这里需要的是RunQueryDsl特征的第一个方法。

这是它如何工作的示例:


    let reward : RewardMatrix = reward_matrix
        .filter(state.eq(schema.clone()))
        .filter(turn_symbol.eq(symbol.clone()))
        .first(&self.connection)?;

但是如果您的查询可能不会返回该行,那么使用 QueryResult 的可选方法也很好:


    let reward : Option<RewardMatrix> = reward_matrix
        .filter(state.eq(schema.clone()))
        .filter(turn_symbol.eq(symbol.clone()))
        .first(&self.connection)?
        .optional();

load返回一个简单的拥有的Vec<RewardMatrix> ,因此任何从Vec获取拥有的元素的解决方案都可以在这里工作:

if let Some(reward) = rewards.into_iter().next() {
    return reward;
}

但是 Diesel 还提供了更适合的替代方案,例如get_resultfirst根本不涉及Vec (与文档中推荐的optional结合使用):

let reward = reward_matrix
    .filter(state.eq(&schema))
    .filter(turn_symbol.eq(&symbol))
    .first::<RewardMatrix>(&self.connection)
    .optional()
    .expect("Error loading posts");

if let Some(reward) = reward {
    return reward;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM