Rust Diesel raw SQL 给出错误 "type annotations needed for `std::result::Result<Vec<T>, diesel::result::Error>`"

Rust Diesel raw SQL gives error "type annotations needed for `std::result::Result<Vec<T>, diesel::result::Error>`"

我正在使用 Diesel 尝试简单的原始 SQL 到 MySQL,如本例所示:

https://docs.diesel.rs/diesel/fn.sql_query.html

let users = sql_query("SELECT username FROM users").load(&connection);

但是这给了我一条错误信息:

error[E0282]: type annotations needed for `std::result::Result<Vec<T>, diesel::result::Error>`
  --> src/main.rs:53:57
   |
53 |     let users = sql_query("SELECT username FROM users").load(&connection);
   |         -----                                           ^^^^ cannot infer type for type parameter `U` declared on the associated function `load`
   |         |
   |         consider giving `users` the explicit type `std::result::Result<Vec<T>, diesel::result::Error>`, where the type parameter `U` is specified

Ps。我需要使用原始 sql 因为我需要 运行 动态 sql.

据我所知,Diesel 无法执行编译时不知道返回行的 'shape' 的查询。这是它的优势之一(至少对于某些用例而言),因为如果使用得当,它将在编译时验证与数据库的交互。

然而,这使得它很难用于动态生成的 SQL。

如果您的查询总是生成相同数量和类型的列,那么您可以这样写:

// Define a type to represent the rows returned by your query

#[derive(QueryableByName)]
struct StringColumn {
    #[sql_type = "Text"]
    username: String
}

// Then you can execute your query, telling Rust that you expect
// to get the rows back as the above type
let users:Vec<StringColumn> = diesel::sql_query("SELECT username FROM users").load(&conn)?;

如果您纯粹使用动态生成的 SQL,您最好直接使用 mysql crate。