如何在Rust sqlx for MySQL中使用IN子句和`Vec`作为参数进行查询?

ijnw1ujt  于 2023-10-15  发布在  Mysql
关注(0)|答案(2)|浏览(166)

注意:这是一个与How to use sqlx to query mysql IN a slice?相似但不重复的问题。我要的是the Rust one
这就是我努力做的。

let v = vec![..];
sqlx::query("SELECT something FROM table WHERE column IN (?)").bind(v)
 ...

然后我得到了以下错误

the trait bound `std::vec::Vec<u64>: sqlx::Encode<'_, _>` is not satisfied
9o685dep

9o685dep1#

答案在FAQ https://github.com/launchbadge/sqlx/blob/master/FAQ.md的第一个

**我如何做一个选择... WHERE foo IN(.)query?**在0.6中,SQLx将支持绑定数组作为每个数据库的逗号分隔列表,但不幸的是,目前SQLx本身没有通用的解决方案。您需要手动生成查询,此时它不能与宏一起使用。

efzxgjgh

efzxgjgh2#

错误显示Vec不是一个必须作为有效DB值的EncodeEncodedoc列出了所有实现了trait的Rust类型。Vec不是一个。
您可以使用以下方式将IN中的参数与vector的值绑定。首先,你需要扩大的数量'?“的值与参数的个数相同。然后,您需要调用bind来逐个绑定这些值。

let v = vec![1, 2];

let params = format!("?{}", ", ?".repeat(v.len()-1));
let query_str = format!("SELECT id FROM test_table WHERE id IN ( { } )", params);

let mut query = sqlx::query(&query_str);
for i in v {
    query = query.bind(i);
}

let row = query.fetch_all(&pool).await?;

注意:如果目标数据库不是MySQL,需要使用$n,比如$1,$2,而不是?,作为参数占位符。

相关问题