Rust Diesel 原始 SQL 给出错误“`std::result::Result<Vec<T>,diesel::result::Error>` 所需的类型注释”

问题描述

我正在尝试使用 Diesel 对 MysqL 进行简单的原始 sql,如下例所示:

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

附言。我需要使用原始 sql,因为我需要运行动态 sql

解决方法

据我所知,在编译时返回行的“形状”未知的情况下,Diesel 没有任何能力执行查询。这是它的优势之一(至少对于某些用例而言),因为如果使用得当,它将在编译时验证与数据库的交互。

然而,这使得动态生成的 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。