问题描述
我正在尝试使用 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
解决方法
据我所知,在编译时返回行的“形状”未知的情况下,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。