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() { ... }
,然後,如果它不是空的同時在第一Message
Vec
作爲我發現的消息使用代碼如
let found_message = find_msg_by_uuid(conn, message_uuid).unwrap()[0];
我總是在Vec
的第一要素,因爲記錄是唯一的,這樣的查詢將只返回1分或0的記錄。
這種感覺那種凌亂的我,似乎採取步驟太多,我覺得如果有一個查詢記錄,那麼它應該返回Option<Message>
不Option<Vec<Message>>
或None
如果沒有記錄匹配查詢。
你可能想使用[首頁](http://docs.diesel.rs/diesel/prelude/trait.FirstDsl.html#method.first) – user25064