我有 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"]
我也花了很多时间来解决这个问题。看起来从 Diesel 1.4.5 开始,您可以添加最新版本的
uuid
,但您必须在 Diesel 上指定 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 crate的
Uuid
(在 Diesel 1.3 中,Diesel 仅支持版本 0.6)。在问题的代码中, Uuid
扩展为 diesel::sql_types::Uuid
#[derive(Queryable)]
pub struct User {
pub id: uuid::Uuid,
pub name: String,
}
我认为这里的问题是
use diesel::sql_types::Uuid;
具有不需要的特征,因此您可以纯粹使用 uuid 板条箱。因此,您可以在一侧使用柴油功能“uuid”来生成实体,并使用 uuid 箱来声明结构:
所以你会得到以下内容:
[dependencies]
diesel = { version = "2.1.0", features = ["postgres", "uuid"] }
uuid = "1.8.0"
... rest of dependencies
在结构中
use diesel::prelude::*;
use uuid::Uuid;
#[derive(Queryable, Selectable)]
#[diesel(table_name = crate::schema::user)]
#[diesel(check_for_backend(diesel::pg::Pg))]
pub struct User {
pub id: Uuid,
pub topic: String,
pub body: String,
pub read: bool,
}