3

我想将 UUID 字段作为 Postgres 表中的主字段,但出现以下错误:

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`

一些较老的问题是关于柴油的 UUID,但没有一个是可插入的,我特别得到了错误。我正在使用带有 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,
    }
}

我发现一些旧帖子表明该字段可能可以为空,但idPRIMARY KEY我的 up.sql 表中,所以它不能为空。

该表是从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"
4

1 回答 1

6

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 文件也会更改。如果您想检查Uuid柴油应用的是哪个。可以通过查看 的来源来检查它,diesel::sql_types::Uuid以确保它们使用与uuid::Uuid.

PS:答案是@weiznich在问题帖子中评论的,只是添加了一些详细信息以及作为答案帖子谁,谁不阅读评论并仅寻找答案

于 2020-03-25T12:00:19.203 回答