rust - 在字符串中提取宏参数
问题描述
我有以下宏:-
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
错误。
解决方案
在 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);
推荐阅读
- python - How to check if a variable contains a rect in Pygame?
- flutter - Flutter:在 AnimatedContainer 内渲染列
- python - 单个输出文件 (CSV) 的 Python 多处理
- julia - 朱莉娅物理学通知神经网络
- html - 如何将 div 元素锚定到其他 2 个 div 元素之间的中心,并且如果其他元素的大小发生变化,它将保持居中?
- javascript - 如何访问云函数中数组上的字段?
- python - Flask 上的 OpenCV 仅适用于“flask run”,而不适用于 Apache2
- spring-boot - JPA 会抛出延迟加载异常,即使它是急切的获取
- google-cloud-platform - 如何使用 v1beta3 API 将 PDF 文档发送到 Google Cloud Document AI?
- docker - WSL2 + Docker - TCP 堆栈中的保持活动错误