我在查询称为表的现有记录messages
;然后,此查询将用作“查找或创建”功能的一部分:
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
或空值的a Vec
,因此我总是最终检查a是否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
如果没有记录匹配查询。
如评论中所述,使用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()
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句