Rust / Diesel:如何查询并插入具有uuid的postgres表

Rust/Diesel: How to query and insert into postgres tables which have uuid

我有Diesel生成的以下架构:

1
2
3
4
5
table! {
user (id) {
    id -> Uuid,
    name -> Text
}

和关联的模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use diesel::{
    self,
    Queryable,
    Insertable,
};
use diesel::prelude::*;
use diesel::sql_types::Uuid;
use super::schema::user;

#[derive(Queryable)]
pub struct User {
    pub id: Uuid,
    pub name: String,
}

impl User {

    pub fn get(id: i32, connection: &PgConnection) -> Vec<User> {
        user::table.load::<User>(connection).unwrap()
    }
}

当我尝试编译以下内容时出现错误:

1
2
21 |         user::table.load::<User>(connection).unwrap()                                                                                                                              
   |                         ^^^^ the trait `diesel::Queryable<diesel::sql_types::Uuid, diesel::pg::Pg>` is not implemented for `diesel::sql_types::Uuid`

如果我尝试插入,则会收到类似的错误消息,提示未实现Expression

这可能是我的依赖项有问题还是我可能忘记将其添加到模型中的问题?

1
2
3
4
5
6
7
8
9
10
11
12
13
[dependencies]
rocket ="0.4.0-rc.1"
serde ="1.0"
serde_derive ="1.0"
serde_json ="1.0"
diesel = { version ="1.0.0", features = ["postgres","uuid"] }
r2d2 ="*"
r2d2-diesel ="*"

[dependencies.rocket_contrib]
version ="0.4.0-rc.1"
default-features = false
features = ["json","diesel_postgres_pool","uuid"]

结构中的类型必须是Rust类型而不是SQL类型,特别是uuid板条箱中的Uuid(在Diesel 1.3中,Diesel仅支持0.6版)。在问题代码中,Uuid扩展为diesel::sql_types::Uuid

1
2
3
4
5
#[derive(Queryable)]
pub struct User {
    pub id: uuid::Uuid,
    pub name: String,
}


这个问题也花了很多时间。从Diesel 1.4.5开始,您可以添加Uuid的最新版本,但必须在Diesel上指定uuidv07功能。

您的Cargo.toml应该看起来像这样:

1
2
uuid = { version ="0.8.2", features = ["serde","v4"] }
diesel = { version ="1.4.5", features = ["chrono","postgres","r2d2","uuidv07"] }

来源:https://github.com/diesel-rs/diesel/issues/2348

注意:另外,就像@canab所说的那样,结构上的Uuid类型应该来自Uuid库,而不是Diesel SQL类型。