2017-09-19 30 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() 
} 
相关问题