为啥我的 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&lt;i64&gt;。那是因为你忘了说id 在你的table declaration 中可以为空。它必须看起来像:

table! 
    clients 
        id -> Nullable<BigInt>,
        name -> Text,
        rank -> Nullable<BigInt>,
    

你可以看到你正在寻找的Queryable的实现in the documentation。

【讨论】:

我收到此错误是因为我重新使用相同的结构进行插入和选择。这是一种模式,其中DEFAULT 字段(即id SERIAL)被定义为Option&lt;i64&gt;,但模式是基于迁移生成的,并且数据库中的字段不是可选的。每次迁移后我都必须手动修改架构(我认为这很好)。

以上是关于为啥我的 Diesel 结构中的可选字段没有实现特征的主要内容,如果未能解决你的问题,请参考以下文章

SpringFox Swagger - 模型中的可选和必填字段

Odoo 14 CE 中的可选依赖项

Python regex - 字符串中的可选字段

Django - 带有序列化程序的可选字段

Symfony 2 URL结构中的可选文化参数?

如何重新运行 Diesel 迁移?