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



注意:这是一个与"如何使用sqlx在切片中查询mysql?"类似但不重复的问题?。我要的是Rust。

这就是我要做的。

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

答案在FAQ中排名第一https://github.com/launchbadge/sqlx/blob/master/FAQ.md

如何进行SELECT。。。在哪里foo IN(…(查询在0.6中,SQLx将支持将数组绑定为每个数据库的逗号分隔列表,但不幸的是,目前还没有通用的解决方案SQLx本身。您需要手动生成查询点,它不能与宏一起使用。

错误显示Vec不是需要作为有效DB值的EncodeEncode文档列出了所有实现了特性的Rust类型。Vec不是一个。

您可以使用以下方式将in中的参数与向量的值绑定。首先,您需要扩大"?"的数量在in表达式中为相同数量的参数。然后,您需要调用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,而不是?,作为参数占位符。

最新更新