2017-09-19 45 views
2

我在查詢名爲messages的表中查詢現有記錄;那麼這個查詢被用作「尋找或創造」的部分功能:如何從Diesel查詢中獲得選項<T>而不是選項<Vec<T>>,該查詢只返回1或0條記錄?

fn find_msg_by_uuid<'a>(conn: &PgConnection, msg_uuid: &Uuid) -> Option<Vec<Message>> { 
    use schema::messages::dsl::*; 
    use diesel::OptionalExtension; 

    messages.filter(uuid.eq(msg_uuid)) 
     .limit(1) 
     .load::<Message>(conn) 
     .optional().unwrap() 
} 

既找到一個記錄,卻沒有找到我做了這個可選的是在這種情況下都有效的結果,從而導致這查詢可能會返回Vec一個Message或空Vec,所以我總是最後檢查是否Vec爲空或不使用這樣的代碼:

let extant_messages = find_msg_by_uuid(conn, message_uuid); 

if !extant_messages.unwrap().is_empty() { ... } 

,然後,如果它不是空的同時在第一MessageVec作爲我發現的消息使用代碼如

let found_message = find_msg_by_uuid(conn, message_uuid).unwrap()[0]; 

我總是在Vec的第一要素,因爲記錄是唯一的,這樣的查詢將只返回1分或0的記錄。

這種感覺那種凌亂的我,似乎採取步驟太多,我覺得如果有一個查詢記錄,那麼它應該返回Option<Message>Option<Vec<Message>>None如果沒有記錄匹配查詢。

+1

你可能想使用[首頁](http://docs.diesel.rs/diesel/prelude/trait.FirstDsl.html#method.first) – user25064

回答

4

正如在評論中提到的,使用first

試圖加載單個記錄。如果找到則返回Ok(record),如果沒有返回結果則返回Err(NotFound)。如果查詢確實是可選的,您可以撥打.optional()得到Result<Option<U>>

fn find_msg_by_uuid<'a>(conn: &PgConnection, msg_uuid: &Uuid) -> Option<Message> { 
    use schema::messages::dsl::*; 
    use diesel::OptionalExtension; 

    messages 
     .filter(uuid.eq(msg_uuid)) 
     .first(conn) 
     .optional() 
     .unwrap() 
} 
相關問題