我正在查询名为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()
}
我已将此设置为可选,因为在这种情况下,查找记录和查找无记录都是有效的结果,因此该查询可能会返回 a Vec
with oneMessage
或 empty 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
如果没有与查询匹配的记录。