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。
我正在使用 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。