如何获得Option <t>而不是Option <vec <t>&gt;从柴油查询中只返回1或0条记录?

时间:2017-09-19 10:16:52

标签: rust rust-diesel

我在名为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如果没有与查询匹配的记录。

1 个答案:

答案 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()
}