3

我正在使用sqlx crate与 Postgres 实例进行交互。

我有以下功能:

pub async fn fetch_tweets_by_metric(
    pool: &PgPool,
    metric: &str,
) -> Result<Vec<Tweet>, sqlx::error::Error> {
    let tweets = sqlx::query_as!(
        Tweet,
        r#"
        SELECT * 
        FROM tweets
        ORDER BY $1 DESC
        "#,
        metric,
    )
    .fetch_all(pool)
    .await?;
    Ok(tweets)
}

我想按表中的一列对结​​果进行排序,以metric. 如果我只是传递一个带有列名的字符串,它就不起作用(即上面的代码被破坏了)。

正确的方法是什么?我在 google 的文档 / 中找不到任何内容。

4

1 回答 1

3

宏只能与常量 SQL 一起使用。

如果您的 sql 是动态的,请使用以下query函数:

pub async fn fetch_tweets_by_metric(
    pool: &PgPool,
    metric: &str,
) -> Result<Vec<Tweet>, sqlx::error::Error> {
    let sql = format!(
        r#"
        SELECT * 
        FROM tweets
        ORDER BY {} DESC
        "#,
        metric,
    );
    let tweets = sqlx::query(sql)
        .fetch_all(pool)
        .await?;
    Ok(tweets)
}
于 2021-06-04T19:23:49.487 回答