我有一个名为order_data
的表,其中包含名为created_on
的timestamp
字段和名为order_id
的i32
字段。我想用不同的方法查询它们。对于created_on
:
pub async fn fetch_last_created_on(pool: &Pool<Postgres>) -> Option<NaiveDateTime> {
let result = match query_as::<Postgres, OrderDb>("select max(created_on) as created_on from order_data")
.fetch_one(pool)
.await
{
Ok(result) => result.created_on,
Err(e) => {
error!("Error fetching data: {}", e);
None
}
};
result
}
对于order_id
:
pub async fn fetch_all_order_ids(pool: &Pool<Postgres>) -> Option<HashSet<i32>> {
let result = match query_as::<Postgres, OrderDb>("select order_id from order_data")
.fetch_all(pool)
.await
{
Ok(result) => Some(result.iter().map(|order| order.order_id.unwrap()).collect()),
Err(e) => {
error!("Error fetching data: {}", e);
None
}
};
result
}
我将OrderDb
定义为:
#[derive(FromRow)]
struct OrderDb {
order_id: Option<i32>,
created_on: Option<NaiveDateTime>,
}
但是,如果使用fetch_last_created_on
,则会导致以下错误
找不到名称的列:订单标识
我可以为每种情况定义两个单独的derive(FromRow)
结构体,但是有没有更好的方法来处理它呢?请注意,我没有使用宏,而是使用了方法。
1条答案
按热度按时间but5z9lq1#
好吧,我明白了。有不同的技术可以使用。对于
created_on
:对于
order_id
(注意,我已经将返回类型从HashSet
更改为Vec
):顺便说一句,也可以用返回
Result
而不是Option
的方式来实现它。我更喜欢在错误发生的地方处理错误,因此在这里将Result
转换为Option