有没有更简洁的方法从(Rust)SQLx中获取单列结果?

4si2a6ki  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(231)

目前我有:

/// The format which SQLx will use to return our rows.
#[derive(sqlx::FromRow, Debug)]
struct FooRow {
    foo: String,
}

pub async fn page(
    Extension(pool): Extension<PgPool>,
    ...
) -> PageTemplate {
    // find the available callsigns
    let rows = sqlx::query_as::<_, FooRow>(r#"SELECT foo FROM bar GROUP BY foo"#)
    .fetch_all(&pool)
    .await
    .unwrap();

    let foos: Vec<String> = rows.into_iter().map(|foo_row| foo_row.callsign).collect();

字符串
String没有实现FromRow,所以我总是需要一个 Package 器结构。
有没有更简洁的方法从SQLx中获取String列,而不需要 Package 器结构和迭代Map?

axr492tv

axr492tv1#

使用query_scalar,这是用于此确切目的的函数:

let rows: Vec<String> = sqlx::query_scalar::<_, String>(r#"SELECT foo FROM bar GROUP BY foo"#)
    .fetch_all(&pool)
    .await?;

字符串

8xiog9wr

8xiog9wr2#

是的,有。最多9个组件的元组类型也实现了FromRow,所以如果你的查询返回一个列,一个单项元组就足够了。

let rows = sqlx::query_as::<_, (String,)>(r#"SELECT foo FROM bar GROUP BY foo"#)
    .fetch_all(&pool)
    .await?;

字符串

相关问题