我在名为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
或空Vec
,所以我总是最终使用这样的代码检查Vec
是否为空:
let extant_messages = find_msg_by_uuid(conn, message_uuid);
if !extant_messages.unwrap().is_empty() { ... }
然后如果它不是空的,请使用{/ p>之类的代码将Message
中的第一个Vec
作为我找到的消息
let found_message = find_msg_by_uuid(conn, message_uuid).unwrap()[0];
我总是占用Vec
中的第一个元素,因为记录是唯一的,因此查询将只返回1或0条记录。
这对我来说有点麻烦,似乎采取了太多步骤,我觉得好像有一个查询记录然后它应该返回Option<Message>
而不是Option<Vec<Message>>
或None
如果没有与查询匹配的记录。
答案 0 :(得分: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()
}