Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何从助手方法动态返回Diesel等式表达式?_Mysql_Rust_Rust Diesel - Fatal编程技术网

Mysql 如何从助手方法动态返回Diesel等式表达式?

Mysql 如何从助手方法动态返回Diesel等式表达式?,mysql,rust,rust-diesel,Mysql,Rust,Rust Diesel,我有一个枚举: enum Role { Administrator, Sponsor, Bot, } 我的数据库中有一个名为“角色”的表,如下所示: |用户id |管理员|赞助商|机器人| |---------|---------------|---------|-------| |0 |真|假|假| |1 |假|假|假| |2 |假|真|真| 如何在使用而不是原始SQL查询时对角色执行匹配,并获取数据库中的相应列 我可以从与角色匹配的方法返回Diesel表达式,但它

我有一个枚举:

enum Role {
    Administrator,
    Sponsor,
    Bot,
}
我的数据库中有一个名为“角色”的表,如下所示:

|用户id |管理员|赞助商|机器人|
|---------|---------------|---------|-------|
|0 |真|假|假|
|1 |假|假|假|
|2 |假|真|真|
如何在使用而不是原始SQL查询时对
角色执行匹配,并获取数据库中的相应列

我可以从与角色匹配的方法返回Diesel表达式,但它不适用于我的insert语句:

#[宏使用]
外部板条箱柴油机;
使用柴油:{
mysql::{mysql,MysqlConnection},
sql_类型:{Bool,Nullable},
BoxableExpression、Connection、ExpressionMethods、RunQueryDsl、,
};
使用架构::{角色,用户};
使用模型:{NewUser};
使用std::error::error;
模式模式{
桌子{
角色(用户id){
id->未签名,
用户标识->未签名,
管理员->可为空,
赞助商->可为空,
bot->Nullable,
}
}
桌子{
用户(id){
id->未签名,
用户名->可为空,
}
}
允许表格在同一查询中出现(
角色,
用户,
);
}
模型{
使用super::schema::users;
#[派生(可插入、PartialEq、调试、默认)]
#[表_name=“用户”]
发布结构NewUser{
pub fn new(用户名:&'a str)->Self{
自我{
用户名
}
}
}
}
枚举角色{
管理员
赞助商
机器人程序,
}
从输入框输入{
fn发件人(r:&Role)->Self{
火柴{
Role::Administrator=>Box::new(roles::dsl::Administrator),
角色::赞助商=>Box::新建(角色::dsl::赞助商),
Role::Bot=>Box::new(roles::dsl::Bot),
}
}
}
fn main()->结果{
让conn=MysqlConnection::建立(“mysql://localhost/stquestion")?;
柴油机::将_替换为(用户::表)
.values(&NewUser::new(“测试帐户”))
.执行(&conn)?;
diesel::将_替换为(角色::表)
.价值观((
角色::dsl::用户id.eq(1),
>::进入(&角色::管理员)
.eq(正确),
))
.执行(&conn)?;
好(())
}
上述代码给我留下了以下编译错误:

error[E0277]:特性绑定的'std::boxed::Box:diesel::query\u source::Column'不满足
-->src/main.rs:36:17
|
36 |值((
|  _________________^
37 | |角色::dsl::用户id.eq(1),
38 | |>::进入(&角色::管理员)
41 | | eq(真),
42 | |         ))
|| _________^未为'std::boxed::Box'实现特征'diesel::query\u source::Column'`
|
=注意:由于'diesel::expression::operators::Eq'的'diesel::insertable::insertable'impl上的要求,因此需要`
=注意:由于对`(diesel::expression::OPERATOR::Eq,di)的'diesel::insertable::insertable'impl的要求,因此需要
esel::表达式::运算符::Eq)`
>错误[E0277]:特性绑定的'std::boxed::Box:diesel::query\u source::Column'不满足
-->src/main.rs:43:10
|
43.执行和控制?;
|^^^^^^未为'std::boxed::Box'实现特征'diesel::query\\源::列'`
|
=注意:由于对'diesel::insertable::ColumnInsertValue'的'diesel::insertable::InsertValues'impl的要求,因此需要`
=注意:由于`(diesel::insertable::ColumnInsertValue,diesel::insertable::ColumnInsertValue,diesel::insertable::ColumnInsertValue)的“diesel::InsertValues::InsertValues”impl中的要求,因此需要此项`
=注意:由于对`diesel::query\U builder::QUERYFRAMENT`的impl中对`diesel::query\U builder::insert\U语句::VALUESCOUSE`的要求,因此需要`
=注意:由于'diesel::query\u builder::QueryFragment'的impl中对'diesel::query\u builder::insert\u语句::InsertStatement'的要求,因此必需`
=注意:由于“diesel::query\U dsl::load\U dsl::EXECUTESL”对“diesel::query\U builder::insert\U语句::INSERTSTATENT”的impl有要求,因此需要`
错误:由于之前的两个错误而中止
有关此错误的详细信息,请尝试“rustc--explain E0277”。
错误:无法编译“stackoverflow问题”。
要了解更多信息,请使用--verbose再次运行该命令。

我为这个问题创建了一个可复制的示例。

在我看来,使用
boxablexpression
是错误的。只需为枚举手动实现
Insertable
,然后直接从那里插入值,就很容易了

使用此
Insertable
impl

impl可插入角色{
类型值=::值;
fn值(自我)->自我::值{
使用板条箱::模式::角色;
匹配自我{
角色::管理员=>(
角色::administrator.eq(true),
角色::赞助商.eq(假),
角色::bot.eq(false),
),
角色::发起人=>(
角色::administrator.eq(false),
角色::赞助商.eq(真),
角色::bot.eq(true),
),
角色::Bot=>(
角色::administrator.eq(false),
角色::赞助商.eq(假),
角色::bot.eq(true),
),
}
.values()
}
}
可以通过以下方式编写插入查询:

diesel::将_替换为(角色::表格)
.value((角色::dsl::用户id.eq(1),角色::管理员))
.执行(&conn)?;

在我看来,在这里使用
BoxableExpression
是错误的。只需为枚举手动实现
Insertable
,然后直接从那里插入值,就很容易了