MySQL: diesel::Expression trait未为f64类型实现
在本文中,我们将介绍在使用diesel时遇到的一个常见错误,即“the trait diesel::Expression is not implemented for f64”。我们将讨论该错误的原因以及如何解决它。
阅读更多:MySQL 教程
什么是DIESEL?
DIESEL是Rust中最常用的ORM之一,它旨在简化与数据库的交互。它建立在Rust类型系统之上,使您可以使用类型安全功能来编写SQL查询。但是,有时在使用DIESEL时,您可能会遇到错误,例如“the trait diesel::Expression is not implemented for f64”。
错误原因
这个错误通常是因为您的Rust code中的字段类型与数据库模式中定义的类型不匹配。例如,假设您有一个包含具有类型f64的某个字段的表。但是,当您使用DIESEL生成的查询时,该标识符的类型为diesel::expression::bound::Bound<f64, Reversed<Nullable<>>>。该错误是由此生成的,因为Bound类型没有实现diesel::Expression trait。
以下是导致此错误的更详细的示例:
extern crate diesel;
table! {
users (id) {
id -> Integer,
name -> Text,
age -> Float,
}
}
#[derive(Queryable)]
struct User {
id: i32,
name: String,
age: f64,
}
fn main() {
use self::users::dsl::*;
let connection = establish_connection();
let age_to_find = 30.5f64;
let query = users.filter(age.gt(age_to_find));
let results = query.load::<User>(&connection);
for user in results {
println!("{:?}", user);
}
}
在这个例子中,当我们运行Rust应用程序时,我们得到了一个错误消息,指出“the trait diesel::Expression is not implemented for f64”。
解决方法
为了解决该错误,我们可以使用diesel提供的sql_type宏手动指定类型,如下所示:
table! {
users (id) {
id -> Integer,
name -> Text,
age -> Float,
}
}
#[derive(Queryable)]
struct User {
id: i32,
name: String,
age: f64,
}
#[derive(Insertable)]
#[table_name = "users"]
pub struct NewUser {
pub name: String,
#[column_type = "Float"]
pub age: f64,
}
fn main() {
use self::users::dsl::*;
let connection = establish_connection();
let age_to_find = 30.5f64;
let query = users.filter(age.gt(age_to_find));
let results = query.load::<User>(&connection);
for user in results {
println!("{:?}", user);
}
}
在这个解决方法中,我们手动为age字段指定了类型Float,以便使其与表上的类型匹配。当我们运行Rust应用程序时,我们得到了正确的输出,其中包含匹配我们查询参数的用户数据。
总结
“diesel::Expression”未为”f64″实现是在使用DIESEL时可能遇到的常见错误之一。该错误通常是由于Rust code中的字段类型与数据库模式中定义的类型不匹配而导致的。为了解决该错误,我们可以手动指定类型,以便与表上的定义匹配。希望这篇文章对您有所帮助。
极客笔记