【问题标题】:How to query using an IN clause and a `Vec` as parameter in Rust sqlx for MySQL?如何在 Rust sqlx for MySQL 中使用 IN 子句和“Vec”作为参数进行查询?
【发布时间】:2021-11-19 17:34:34
【问题描述】:

注意:这是与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

【问题讨论】:

  • 你目前不能。
  • 也欢迎任何解决方法(手动进行 SQL 查询?如果我这样做有任何防止注入的提示吗?)。
  • 根据docs,看来只有PostgreSQL后端才有可能。

标签: mysql rust rust-sqlx


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    错误显示Vec 不是Encode,它必须是有效的 DB 值。 Encode doc 列出了所有已实现该 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,而不是?,作为参数占位符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-12
      • 2015-02-25
      • 2015-04-02
      • 2017-03-26
      • 2010-11-17
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多