无法将UUID用作主键:Uuid:diesel::Expression未满足。

7

我希望在Postgres表中将UUID字段作为主键,但是我遇到了以下错误:

error[E0277]: the trait bound `uuid::Uuid: diesel::Expression` is not satisfied
 --> database/src/models.rs:3:35
  |
3 | #[derive(Debug, Clone, Queryable, Insertable)]
  |                                   ^^^^^^^^^^ the trait `diesel::Expression` is not implemented for `uuid::Uuid`
  |
  = note: required because of the requirements on the impl of `diesel::expression::AsExpression<diesel::sql_types::Uuid>` for `uuid::Uuid`

有一些关于在diesel中使用UUID的旧问题,但它们都无法插入数据,并且我正面临这个具体的错误。我正在使用diesel和actix web。

这是我的模型:

use crate::schema::users;

#[derive(Debug, Clone, Queryable, Insertable)]
#[table_name="users"]
pub struct User {
    pub id: uuid::Uuid,
    pub phone: String,
    pub name: String,
    pub password: String,
}

我的数据库表结构

table! {
    users (id) {
        id -> Uuid,
        name -> Text,
        phone -> Text,
        password -> Text,
    }
}

我找到了一些旧帖子,它们表明该字段可能是可空的,但在我的表up.sql中,idPRIMARY KEY,因此它不可为空。

这个表是从diesel-cli生成的,所以似乎没有任何问题。

这是我的Cargo.toml文件:

diesel = { version = "1.0.0", features = ["postgres", "r2d2", "uuid"] }
uuid = { version = "0.8", features = ["v4"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

2
你能否提供更多关于你使用的 dieseluuid 版本的信息?另外,你为 diesel 启用了哪些特性标志?很可能是由于缺少特性标志或者 uuid 版本不匹配导致的问题。请注意检查 diesel 内部使用的 uuid 版本和你自己使用的 uuid 版本是否一致。 - weiznich
3
目前最新发布的 Diesel 暂不支持 uuid 的 0.8 版本,只支持 0.7 及以下版本。此外,你需要使用 uuidv07 功能来支持 0.7 版本。这将在下一个 Diesel 发布中改变。 - weiznich
1个回答

8

查看 Cargo.lock 文件以及指向包依赖项的版本是很有好处的。

[[package]]
name = "diesel"
version = "1.4.4"
...
 "uuid 0.6.5", <-- It was older version even I've installed newest version of uuid
]

一旦将特征更改为 uuidv07 并运行 cargo updateCargo.lock 文件也会更改。如果您想检查 diesel 应用的是哪个 Uuid 版本,可以查看 diesel::sql_types::Uuid 的源代码,以确保它们使用与 uuid::Uuid 相同的版本。
附注:该答案是在问题帖子中由 @weiznich 评论的,只是添加了一些详细信息,并作为答案发布,供那些只寻找答案而不阅读评论的人参考。

我是一个初学者,我猜diesel中的uuid是一个对等依赖项,但为什么它会引起这个问题,因为它与主要的cargo.toml不同。 - Ping Woo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接