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

7
注意:这个问题与如何使用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

你目前无法这样做。 - Ivan C
如果有任何解决方法(手动制作SQL查询?如果这样做,如何防止注入攻击?)也欢迎分享。 - Jason Lee
根据文档,看起来这只适用于PostgreSQL后端。 - Jmb
2个回答

6

问题的解答在FAQ中的第一个,https://github.com/launchbadge/sqlx/blob/master/FAQ.md

如何执行SELECT ... WHERE foo IN (...) 查询? 在0.6版本中,SQLx将支持将数组绑定为每个数据库的逗号分隔列表,但目前SQLx本身没有通用解决方案。您需要手动生成查询,此时无法与宏一起使用。


5
错误提示显示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,而不是?作为参数占位符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接