Rust/Diesel: как запросить и вставить в postgres таблицы, в которых есть uuid

У меня есть следующая схема, сгенерированная Diesel:

table! {
user (id) {
    id -> Uuid,
    name -> Text
}

и связанная модель

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()
    }
}

Я получаю ошибку, когда пытаюсь скомпилировать это, которое говорит:

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 не реализовано.

Может ли это быть проблемой с моими зависимостями или что-то, что я, возможно, забыл добавить в модель?

[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"]

2 ответа

Просто потратил много времени на эту проблему. Похоже, начиная с Diesel 1.4.5, вы можете добавить последнюю версию , но вы должны указать uuidv07функция на Дизеле.

Ваш Cargo.tomlдолжно выглядеть примерно так:

      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.

Тип в структуре должен быть типом Rust, а не типом SQL, в частности Uuid из ящика uuid (в Diesel 1.3 только версия 0.6 поддерживается Diesel). В коде из вопроса Uuid расширяется до diesel::sql_types::Uuid

#[derive(Queryable)]
pub struct User {
    pub id: uuid::Uuid,
    pub name: String,
}
Другие вопросы по тегам