为啥我的 Diesel 结构中的可选字段没有实现特征
Posted
技术标签:
【中文标题】为啥我的 Diesel 结构中的可选字段没有实现特征【英文标题】:Why do I get a trait not implemented for an optional field in Diesel struct为什么我的 Diesel 结构中的可选字段没有实现特征 【发布时间】:2019-03-27 06:07:03 【问题描述】:我有这个结构:
#[table_name = "clients"]
#[derive(Serialize, Deserialize, Queryable, Insertable, Identifiable, Associations)]
pub struct Client
pub id: Option<i64>,
pub name: String,
pub rank: Option<i64>,
以及以下实现:
impl Client
pub fn get(name: String, connection: &PgConnection) -> Option<Self>
match clients::table
.filter(clients::name.eq(&name))
.limit(1)
.load::<Client>(connection)
Ok(clients) => Some(clients[0]),
Err(_) => None,
这给了我以下错误:
.load::<Client>(connection)
^^^^ the trait `diesel::Queryable<diesel::sql_types::BigInt, _>` is not implemented for `std::option::Option<i64>`
【问题讨论】:
请注意,如果你想返回一个拥有的客户而不是一个参考,而不是你的匹配,你可以写.ok().and_then(|clients| clients.into_iter().next())
。
您在table
宏中添加了什么?我想问题就在那里。
请查看如何创建minimal reproducible example,然后查看edit 您的问题以包含它。例如,我们无法分辨模式是什么。尝试在一个全新的 Cargo 项目中重现您的错误。还有Rust-specific MCVE tips 和Diesel-specific tips。
【参考方案1】:
您的错误消息说您无法将BigInt
(64 位整数)查询到Option<i64>
。那是因为你忘了说id
在你的table declaration 中可以为空。它必须看起来像:
table!
clients
id -> Nullable<BigInt>,
name -> Text,
rank -> Nullable<BigInt>,
你可以看到你正在寻找的Queryable
的实现in the documentation。
【讨论】:
我收到此错误是因为我重新使用相同的结构进行插入和选择。这是一种模式,其中DEFAULT
字段(即id SERIAL
)被定义为Option<i64>
,但模式是基于迁移生成的,并且数据库中的字段不是可选的。每次迁移后我都必须手动修改架构(我认为这很好)。以上是关于为啥我的 Diesel 结构中的可选字段没有实现特征的主要内容,如果未能解决你的问题,请参考以下文章