`bigdecimal::BigDecimal` 没有实现特征 `diesel::Expression`
Posted
技术标签:
【中文标题】`bigdecimal::BigDecimal` 没有实现特征 `diesel::Expression`【英文标题】:the trait `diesel::Expression` is not implemented for `bigdecimal::BigDecimal` 【发布时间】:2019-09-10 23:27:14 【问题描述】:我正在尝试创建一个可以在柴油中用于插入的结构。具体来说,我正在使结构可插入。编译时出现此错误。
我有一个结构,我试图通过派生属性创建Insertable
。我有一个名为Bounty
的字段应该代表金钱,所以我使用BigDecimal
作为类型。编译后,我得到标题中的错误。我也尝试过使用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()
我的结构在它自己的文件中,这是整个代码。 struct Thread
编译没有问题。错误发生在InsertableThread
上,因为它是使用BigDecimal
的错误。这是导致的错误。
error[E0277]: the trait bound `bigdecimal::BigDecimal: diesel::Expression` is not satisfied
--> src/main.rs:29:21
|
29 | #[derive(Debug, Insertable)]
| ^^^^^^^^^^ the trait `diesel::Expression` is not implemented for `bigdecimal::BigDecimal`
|
= note: required because of the requirements on the impl of `diesel::expression::AsExpression<diesel::sql_types::Numeric>` for `bigdecimal::BigDecimal`
error[E0277]: the trait bound `bigdecimal::BigDecimal: diesel::Expression` is not satisfied
--> src/main.rs:29:21
|
29 | #[derive(Debug, Insertable)]
| ^^^^^^^^^^ the trait `diesel::Expression` is not implemented for `bigdecimal::BigDecimal`
|
= note: required because of the requirements on the impl of `diesel::Expression` for `&bigdecimal::BigDecimal`
= note: required because of the requirements on the impl of `diesel::expression::AsExpression<diesel::sql_types::Numeric>` for `&bigdecimal::BigDecimal`
error[E0277]: the trait bound `bigdecimal::BigDecimal: diesel::Expression` is not satisfied
--> src/main.rs:29:21
|
29 | #[derive(Debug, Insertable)]
| ^^^^^^^^^^ the trait `diesel::Expression` is not implemented for `bigdecimal::BigDecimal`
|
= note: required because of the requirements on the impl of `diesel::Expression` for `&'insert bigdecimal::BigDecimal`
= note: required because of the requirements on the impl of `diesel::expression::AsExpression<diesel::sql_types::Numeric>` for `&'insert bigdecimal::BigDecimal`
我正在使用 Rust 1.34、柴油 1.4.2 和 Postgres 11。
我愿意更改数据库、Postgres 或 Rust 代码中的类型。数据库使用numeric
,在Rust 代码中我尝试了f64
和BigDecimal
。我也愿意自己直接实现这个特征,但我需要一些指导,因为我找不到样本。
【问题讨论】:
提供结构Thread
的目的是什么?重现错误是否必需?请确保您的minimal reproducible example最小。
请尝试以可读的方式格式化您的问题。编辑器提供 UI 按钮来帮助您正确格式化,有 a help document 如果您不熟悉 Markdown,可以查看对您的问题所做的现有编辑,还有实时预览让您知道自己是什么准备提交。
你提供的代码没有报你问的错误。取而代之的是:属性table_name
目前对编译器来说是未知的,并且将来可能会增加它的含义。请查看如何创建minimal reproducible example,然后查看edit 您的问题以包含它。尝试在全新的 Cargo 项目中重现您的错误。有Rust-specific MCVE tips 和Diesel tips 可以用来减少您在此处发布的原始代码。
是否需要包含所有这些依赖项,例如“sparkpost”,才能产生错误? Title
、Bounty
等字段是否必填?请确保您的minimal reproducible example最小。
【参考方案1】:
Diesel 使用 Cargo features 选择加入增强功能。
我还没有找到明确的文档页面,但它们在its Cargo.toml 中列出:
[features]
default = ["with-deprecated", "32-column-tables"]
extras = ["chrono", "serde_json", "uuid", "deprecated-time", "network-address", "numeric", "r2d2"]
unstable = ["diesel_derives/nightly"]
large-tables = ["32-column-tables"]
huge-tables = ["64-column-tables"]
x32-column-tables = ["32-column-tables"]
32-column-tables = []
x64-column-tables = ["64-column-tables"]
64-column-tables = ["32-column-tables"]
x128-column-tables = ["128-column-tables"]
128-column-tables = ["64-column-tables"]
postgres = ["pq-sys", "bitflags", "diesel_derives/postgres"]
sqlite = ["libsqlite3-sys", "diesel_derives/sqlite"]
mysql = ["mysqlclient-sys", "url", "diesel_derives/mysql"]
with-deprecated = []
deprecated-time = ["time"]
network-address = ["ipnetwork", "libc"]
numeric = ["num-bigint", "bigdecimal", "num-traits", "num-integer"]
您需要启用 numeric 功能并确保使用与 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,
另见:
Why is a trait not implemented for a type that clearly has it implemented?【讨论】:
谢谢 Shepmaster。顺便说一句,我不得不将我的 BigDecimal 版本降级到 0.0.14。对于诸如此类的外部 crate 依赖项,diesel 是否有兼容版本列表等? @user583824 这就是我提供“另见”链接的原因,这就是我想出来的。 如果您遇到类似问题但其他类型的问题,请检查“附加”功能。我只花了两个小时试图弄清楚为什么我的 Date/NaiveDate 不起作用。 要获得兼容版本的 BigDecimal,只需使用cargo tree
您可以通过以下方式检查所需的大十进制版本:cargo tree | grep bigdecimal
【参考方案2】:
你可能会通过搜索一个非常相似的错误消息来解决这个问题:
the trait `diesel::Expression` is not implemented for `(schema::..., schema::..., schema::...)`
这只是提醒您计算table!
宏中的列数,因为您可能会达到默认的 32 列限制。
根据Diesel changelog,如果您使用超过默认的 32 列,您应该使用以下功能。
64 列 (Cargo.toml)
diesel = version = "1.4", features = [..., "64-column-tables"]
128 列(Cargo.toml):
diesel = version = "1.4", features = [..., "128-column-tables"]
使用更多列是不可能的,并且可能暗示表格设计不理想(请参阅:https://github.com/diesel-rs/diesel/issues/2312#issuecomment-591623303)。
【讨论】:
这个答案和bigdecimal::BigDecimal
的问题有什么关系?
@Shepmaster 感谢您的评论。我添加了一个解释。在搜索错误消息时,很容易在没有注意到错误消息略有不同的情况下结束此页面。
我正是来到了这个问题,因为我达到了 33 列,并且应该告诉我考虑到错误的详细程度,这是我的 +1^32 给你。
这正是发生在我身上的事。谢谢。【参考方案3】:
请注意,尽管 Diesel 支持其 Toml 文件中提到的 BigDecimal 的一系列版本,但就我而言,我需要作为 Diesel 的依赖项安装的 EXACT BigDecimal 版本,以用作我自己的应用程序依赖项。
您可以通过运行 cargo tree
获得 Diesel 使用的确切版本
【讨论】:
以上是关于`bigdecimal::BigDecimal` 没有实现特征 `diesel::Expression`的主要内容,如果未能解决你的问题,请参考以下文章