首页 > 解决方案 > 在字符串中提取宏参数

问题描述

我有以下宏:-

macro_rules! update_user {
    ($tx:ident, $id:expr, $key:expr, $val:expr) => {
        sqlx::query!(
            "UPDATE users SET
            $key = ?
            WHERE id = $id
            "
            , $val
        ).execute(&mut $tx).await?;

    };
}

我怎样才能让这个宏在字符串中使用 $id 和 $key 的值?我不能format!query!预期只使用字符串文字

编辑; 连接!宏不工作


macro_rules! update  {
    ($tx:ident, $col:tt, $val:expr, $id:expr) => {
        if let Some(some) = $val {
            sqlx::query!(
                concat!(
                "UPDATE users SET",
                $col ," = ?  ",
                "where id = ? "
                ),
                some, $id
            ).execute(&mut $tx).await?;
        }
    };
}

pub(crate) async fn update_user<'a> (
    db : &MySqlPool,
    user : User<'a>,
) -> RouteResult<()> {

    let mut tx = db.begin().await?;

    update!(tx, "uname", user.uname, user.id);

    if let Some(uname) = user.uname {
        sqlx::query!(
            "UPDATE users SET
            uname = ? 
            where id = ? 
            ",
            uname, user.id
        ).execute(&mut tx).await?;
    }

    tx.commit().await?;

    Ok(())
}

这给出了expected string literal错误。

标签: rustmacrosrust-sqlx

解决方案


在 sqlx 的不和谐论坛上得到了答案。我不得不使用+而不是concat!. 我接受 Mihir 的回答,因为它回答了标题,但我不得不使用以下

macro_rules! update {
    ($tx:ident, $table:tt, $col:tt, $val:expr, $id:expr) => {
        if let Some(some) = $val {
            sqlx::query!(
                "UPDATE "
                    + $table
                    + " SET "
                    + $col
                    + " = ?  
                where id = ? ",
                some,
                $id
            )
            .execute(&mut $tx)
            .await?;
        }
    };
}
...
//use it like this
update!(tx, "users", "uname", user.uname, user.id);

推荐阅读