带有 uuid 失败的 diesel-rust (Postgres),E0277 diesel::Expression 不满足

diesel-rust (Postgres) with uuid failing, E0277 diesel::Expression is not satisfied

提问人:TazMainiac 提问时间:10/19/2023 最后编辑:TazMainiac 更新时间:10/19/2023 访问量:65

问:

我正在将现有的 Python/SQLAlchemy 应用程序移植到 rust。我对 rust 完全陌生,似乎 diesel 是 SQLAlchemy 的合理替代品(我还需要做 postgis,而 diesel 似乎是唯一具有此功能的 rust ORM)。

简单的代码演示在 github diesel_uuid上。根据这里和这里的帖子,我有依赖关系:

uuid = { version = "0.8.2", features = ["serde", "v4"] }
diesel = { version = "2.1.0", features = ["chrono", "postgres", "r2d2", "uuid"] }

它构建并运行,但我的 UUID 类型有问题。

在我的 src/bin/get_user.rs 代码中,我有:

    let real_uid = Uuid::parse_str( &id );

    let results = uuid_users
               .filter( user_uid.eq( real_uid ) )
               .limit(5)
               .select(models::UuidUser::as_select())
               .load(connection)
               .expect("Error loading users");

如果我尝试构建它,我会得到:

error[E0277]: the trait bound Result<uuid::Uuid, uuid::Error>: diesel::Expression is not satisfied
 --> src/bin/get_user.rs:19:20
   |
19 |     .filter( user_uid.eq( real_uid ) )
   |                       ^^ the trait diesel::Expression is not implemented for Result<uuid::Uuid, uuid::Error>
   |

然后又出现了一堆错误。 如果我改用 String 列(名称)进行过滤,它就可以正常工作,因此代码可以工作 - 只是不是 uuid 过滤器。

根据其他关于 diesel 和 uuid 的帖子,我想知道我是否在 dr.r.t. diesel 和 uuid 版本控制方面做错了什么?或者也许是使用和修改行的一些使用顺序?

UUID 锈-柴油

评论

0赞 Chayim Friedman 10/19/2023
请创建一个最小的、可重复的示例
0赞 kmdreko 10/19/2023
该错误意味着这是某种类型,这似乎是不正确的。user_uidResult
0赞 TazMainiac 10/19/2023
github 代码是最小可重现的示例。
0赞 Ross Rogers 10/19/2023
如果你这样做了,它编译了,那么类型是错误的,你需要处理第一个。user_uid.eq(real_uid.unwrap())real_uidResult
0赞 cafce25 10/19/2023
Stack Overflow 帖子必须是自包含的,因此指向存储库(或其他外部资源)的链接对于最小可重现示例是不够的。

答:

1赞 TazMainiac 10/19/2023 #1

啊呀呀......

Uuid::p arse_str 返回 Result<Uuid, Error>。在其上调用 .unwrap() 可以解决问题。

感谢 Ross Rogers 的修复。

评论

0赞 Ross Rogers 10/20/2023
unwrap()有点黑客。如果可能,您应该使用运算符将一个好的错误传播到堆栈中。您可能应该这样做,例如或?let real_uid = Uuid::parse_str( &id )?;let real_uid = Uuid::parse_str( &id ).map_err(|e| MyError(format!("parsing the user-supplied error no-workie - {e}")))?;