Как я могу использовать функцию sql CAST в ржавчине, дизельном топливе?

Я разрабатываю новую конечную точку с помощью 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, чтобы найти правильный синтаксис рядом с \ ') = CAST (' rainfall '.' Datetime ') \' в строке 1"

Как показано в необработанном операторе SQL, он должен читать CAST('rainfall'.'datetime' as date).

У меня вопрос: как добавить компонент "as date" в мой запрос на дизельное топливо? Что-то не хватает в определении sql_function?

Спасибо за вашу помощь.


person Jake Scott    schedule 17.01.2020    source источник


Ответы (1)


Я нашел ответ после более глубокого изучения подобных вопросов.

Оказывается, вы можете ввести необработанную строку sql в метод .filter после добавления: use diesel::expression::sql_literal::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)?;

Надеюсь, это поможет кому-то другому!

person Jake Scott    schedule 17.01.2020
comment
Можно ли ввести необработанный sql в .select() для использования метода to_char? Например: select to_char(date_field, 'YYYY-MM') from table_name в дизельном ORM. - person Dvex; 25.04.2020