[英]Return single record created in PostgreSQL using Rocket and Diesel (Rust)
[英]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_result
和first
根本不涉及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.