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