Postgresql 没有为“bigdecimal::bigdecimal”实现特性“diesel::Expression”`

Postgresql 没有为“bigdecimal::bigdecimal”实现特性“diesel::Expression”`,postgresql,rust,rust-diesel,Postgresql,Rust,Rust Diesel,我正在尝试创建一个可以在diesel中用于插入的结构。具体来说,我正在使结构可插入。在编译时,我得到了这个错误 我有一个结构,我正试图通过派生属性使其可插入。我有一个名为Bounty的字段,它应该表示金钱,所以我使用bigdecimic作为类型。编译后,我得到了标题中的错误。我也尝试过使用f64,但也会出现同样的错误 #[macro_use] extern crate diesel; extern crate bigdecimal; mod schema { use bigdecima

我正在尝试创建一个可以在diesel中用于插入的结构。具体来说,我正在使结构可插入。在编译时,我得到了这个错误

我有一个结构,我正试图通过派生属性使其可插入。我有一个名为
Bounty
的字段,它应该表示金钱,所以我使用
bigdecimic
作为类型。编译后,我得到了标题中的错误。我也尝试过使用f64,但也会出现同样的错误

#[macro_use]
extern crate diesel;
extern crate bigdecimal;

mod schema {
    use bigdecimal::BigDecimal;
    table! {
        Threads (Id) {
            Id -> Int8,
            Views -> Int4,
            Points -> Int4,
            FlagPoints -> Int4,
            IsDisabled -> Bool,
            IsAnswered -> Bool,
            Bounty -> Numeric,
            Title -> Varchar,
            Body -> Text,
            UserId -> Int8,
            CreatedBy -> Varchar,
            CreatedOn -> Timestamptz,
            LastModifiedBy -> Varchar,
            LastModifiedOn -> Timestamptz,
        }
    }

    #[allow(non_snake_case)]
    #[derive(Debug, Insertable)]
    #[table_name = "Threads"]
    pub struct InsertableThread { 
        pub Bounty: BigDecimal,
        pub Title: String,
        pub Body: String,
        pub UserId: i64
    }
}

fn main() {}
我把我的结构放在它自己的文件中,这是完整的代码。结构
线程
编译时不会出现问题。错误发生在
InsertableThread
上,因为它是使用
BigDecimal
的线程。这就是导致的错误

error[E0277]:特性绑定'bigdecimal::bigdecimal:diesel::Expression'不满足
-->src/main.rs:29:21
|
29 |#[派生(调试,可插入)]
|^^^^^^^^^^未为` bigdecimal::bigdecimal'实现特性` diesel::Expression'`
|
=注意:由于对`bigdecimal::bigdecimal`的`diesel::expression::AsExpression`的impl有要求,因此必须输入`
错误[E0277]:未满足特性绑定的`bigdecimal::bigdecimal:diesel::Expression`
-->src/main.rs:29:21
|
29 |#[派生(调试,可插入)]
|^^^^^^^^^^未为` bigdecimal::bigdecimal'实现特性` diesel::Expression'`
|
=注意:由于“&bigdecimal::bigdecimal”的“diesel::Expression”impl中的要求,因此需要`
=注意:由于“&bigdecimal::bigdecimal”的“diesel::expression::AsExpression”impl中的要求,因此需要此选项`
错误[E0277]:未满足特性绑定的`bigdecimal::bigdecimal:diesel::Expression`
-->src/main.rs:29:21
|
29 |#[派生(调试,可插入)]
|^^^^^^^^^^未为` bigdecimal::bigdecimal'实现特性` diesel::Expression'`
|
=注意:由于`&'insert bigdecimal::bigdecimal::Expression`的impl中的要求,因此需要`
=注意:由于`&'insert bigdecimal::bigdecimal::AsExpression`的impl要求,因此必需`
我使用的是Rust 1.34、diesel 1.4.2和Postgres 11

我愿意更改数据库、Postgres或Rust代码中的类型。数据库使用
numeric
,在Rust代码中,我尝试了
f64
bigdecimic
。我也愿意自己直接实现这个特性,但是我需要一些关于如何实现的指导,因为我找不到示例。

Diesel使用它来选择增强功能

我还没有找到关于这些的清晰文档页面,但它们列在:

您需要启用数值功能,并确保使用与Diesel兼容的bigdecimal版本:

[dependencies]
diesel = { version = "1.4.2", features = ["numeric"] }
bigdecimal = "0.0.14"
代码编译:

#[macro_use]
extern crate diesel;

use crate::schema::threads;
use bigdecimal::BigDecimal;

mod schema {
    table! {
        threads (id) {
            id -> Int4,
            bounty -> Numeric,
        }
    }
}

#[derive(Debug, Insertable)]
#[table_name = "threads"]
pub struct InsertableThread {
    pub bounty: BigDecimal,
}
另见:


您可以通过搜索一条非常类似的错误消息来解决此问题:

the trait `diesel::Expression` is not implemented for `(schema::..., schema::..., schema::...)`
这只是提醒您计算
表中的列数!{}
宏,因为您可能达到默认的32列限制

根据,如果使用的列多于默认的32列,则应使用以下功能

64列(Cargo.toml
diesel={version=“1.4”,features=[…,“64列表”]}
128列(Cargo.toml):
diesel={version=“1.4”,features=[…,“128列表”]}

使用更多的列是不可能的,这可能暗示表的设计并不理想(请参见:)。

提供struct
Thread
有什么作用?是否需要重现错误?请确保您的问题是最小的。请尝试以可读的方式格式化您的问题。编辑器提供UI按钮以帮助您正确设置格式。如果您不熟悉降价,您可以查看对问题所做的现有编辑,还有一个实时预览,以便您知道要提交的内容。您提供的代码不会报告您询问的错误。相反:编译器目前不知道属性
table_name
,将来可能会增加它的含义。请检查如何创建一个,然后检查您的问题以将其包括在内。试着在一个全新的货运项目中重现你的错误。有,您可以使用来减少您在此处发布的原始代码。是否需要包含所有这些依赖项(如“sparkpost”)来生成错误?是否需要
标题
赏金
等字段?请确保您的密码是最小的。谢谢Shepmaster。除此之外,我不得不将我的BigDecimal版本降级到0.0.14。diesel是否有兼容版本列表或类似的外部板条箱依赖项,如此?@user583824这就是我提供“请参阅”链接的原因,这是我如何解决的。如果您遇到类似问题,但有其他类型的问题,也请检查“extras”功能。我刚刚花了两个小时想弄明白为什么我的日期不起作用。这个答案和这个问题有什么关系,这个问题是关于
bigdecimal::bigdecimal
?@Shepmaster谢谢你的评论。我补充了一个解释。当搜索错误消息时,很容易在本页上发现错误消息略有不同。我正是来问这个问题的,因为我有33列,应该告诉大家,鉴于错误的详细程度,这里是我的+1^32。这正是我遇到的情况。非常感谢。
the trait `diesel::Expression` is not implemented for `(schema::..., schema::..., schema::...)`