我正在使用Rocket开发新的端点,并试图返回由各种结构组成的Vec <>。
我要在柴油中复制的原始查询是:
select location.id, location.name, w.datetime, t.temp, w.compass, w.speed, r.probability, s.height
from location
inner join rainfall r on location.id = r.location
inner join temperature t on location.id = t.location
inner join wind w on location.id = w.location
inner join swell s on location.id = s.location
where t.datetime = w.datetime
and s.datetime = t.datetime
and CAST(t.datetime as date) = CAST(r.datetime as date)
and t.datetime > now() and t.datetime < NOW() + INTERVAL 1 HOUR;
而且我知道,要使用CAST功能,我需要使用sql_function!宏:
sql_function! {
#[sql_name="CAST"]
fn cast(x: sql_types::Nullable<sql_types::Datetime>) -> sql_types::Date;
}
这使我可以创建以下查询:
let summaries: Vec<(Location, Swell, Wind, Temperature, Rainfall)> = location::table
.inner_join(swell::table)
.inner_join(wind::table)
.inner_join(temperature::table)
.inner_join(rainfall::table)
.filter(temperature::datetime.eq(wind::datetime))
.filter(temperature::datetime.eq(swell::datetime))
.filter(temperature::datetime.gt(utilities::today()))
.filter(temperature::datetime.lt(utilities::future_hour(1)))
.filter(cast(temperature::datetime).eq(cast(rainfall::datetime)))
.load(&conn.0)?;
但是,当我运行此查询时,出现SQL查询错误:
“您的SQL语法有误;请在与MySQL服务器版本相对应的手册中找到在第1行\')= CAST('rainfall'。'datetime')\'附近使用的正确语法。
如原始SQL语句所示,它应显示为CAST('rainfall'.'datetime' as date)
。
我的问题是,如何在柴油查询中添加“按日期”组件? sql_function定义中缺少某些内容吗?
感谢您的帮助。
答案 0 :(得分:1)
在深入研究类似问题之后,我找到了答案。
结果证明,您可以在添加.filter
之后在use diesel::expression::sql_literal::sql;
方法中输入原始sql字符串。
所以最后的代码片段变成:
let summaries: Vec<(Location, Swell, Wind, Temperature, Rainfall)> = location::table
.inner_join(swell::table)
.inner_join(wind::table)
.inner_join(temperature::table)
.inner_join(rainfall::table)
.filter(temperature::datetime.eq(wind::datetime))
.filter(temperature::datetime.eq(swell::datetime))
.filter(temperature::datetime.gt(utilities::today()))
.filter(temperature::datetime.lt(utilities::future_hour(1)))
.filter(sql("CAST(`temperature`.`datetime` as date) = CAST(`rainfall`.`datetime` as date)"))
.load(&conn.0)?;
我希望这对其他人有帮助!