Rust Diesel условно обновляет поля

Я пытаюсь использовать дизель diesel = { version = "1.4.8", features = ["postgres","64-column-tables","chrono","serde_json"] } для проекта, и я хотел бы обновить некоторые поля в таблице postgresql, параметр передачи от клиента определяется следующим образом:

pub struct UpdateChannelRequest {
    pub channelId: i64,
    pub tags: Option<Vec<Tag>>,
    pub commentRss: i32,
    pub partOutput: i32,
    pub subStatus: i32
}

Я использую этот код для обновления таблицы прямо сейчас:

pub fn update_channel_impl(request: &Json<UpdateChannelRequest>){
    use crate::model::diesel::dolphin::dolphin_schema::rss_sub_source::dsl::*;
    let connection = config::establish_connection();
    let predicate = crate::model::diesel::dolphin::dolphin_schema::rss_sub_source::id.eq(request.channelId);
    diesel::update(rss_sub_source.filter(predicate))
        .set((comment_rss.eq(&request.commentRss),part_output.eq(&request.partOutput),sub_status.eq(&request.subStatus)))
        .get_result::<RssSubSource>(&connection)
        .expect("unable to update channel");
}

проблема, с которой я сталкиваюсь, заключается в том, что интерфейс должен каждый раз передавать все поля обновления. Можно ли сделать условное обновление на стороне сервера с прохождением полей? Например, определите некоторые поля как Option, если передано значение полей, обновите его. Если не передать значение, просто игнорируйте поля (идентификатор должен быть передан, потому что нам нужно обновить запись по идентификатору).

🤔 А знаете ли вы, что...
PostgreSQL активно развивается и обновляется, включая в себя новые возможности и улучшения.


26
1

Ответ:

Решено

If the struct has any optional fields on it, these will also have special behavior. By default, #[derive(AsChangeset)] will assume that None means that you don’t wish to assign that field.

Руководство по обновлениям