注意:这是一个类似但不重复的问题,如何使用 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
注意:这是一个类似但不重复的问题,如何使用 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 ... WHERE foo IN (...) 查询?在 0.6 中,SQLx 将支持将数组绑定为每个数据库的逗号分隔列表,但不幸的是,目前在 SQLx 本身中没有通用的解决方案。您需要手动生成查询,此时它不能与宏一起使用。
错误显示Vec
不是Encode
作为有效数据库值所必需的。该Encode
文档列出了所有已实现该 trait 的 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,而不是?,作为参数占位符。