rust 如何使用sqlxquery_as提取某些模型字段

wsewodh2  于 2023-02-23  发布在  其他
关注(0)|答案(1)|浏览(145)

我有一个名为order_data的表,其中包含名为created_ontimestamp字段和名为order_idi32字段。我想用不同的方法查询它们。对于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)结构体,但是有没有更好的方法来处理它呢?请注意,我没有使用宏,而是使用了方法。

but5z9lq

but5z9lq1#

好吧,我明白了。有不同的技术可以使用。对于created_on

pub async fn fetch_last_created_on(pool: &Pool<Postgres>) -> Option<NaiveDateTime> {
    let result: (Option<NaiveDateTime>, ) = query_as("select max(created_on) from order_data")
        .fetch_one(pool)
        .await
        .unwrap_or_else(|e| {
            error!("Couldn't fetch data! {}", e);
            (None, )
        });

    result.0
}

对于order_id(注意,我已经将返回类型从HashSet更改为Vec):

pub async fn fetch_all_order_ids(pool: &Pool<Postgres>) -> Option<Vec<i32>> {
    return match query_scalar("select order_id from order_data")
        .fetch_all(pool)
        .await {
        Ok(order_ids) => {
            Some(order_ids)
        }
        Err(e) => {
            error!("Couldn't fetch order ids! {}", e);
            None
        }
    };
}

顺便说一句,也可以用返回Result而不是Option的方式来实现它。我更喜欢在错误发生的地方处理错误,因此在这里将Result转换为Option

相关问题