如何实现柴油防 rust ::Insertable< table>

k2arahey  于 2023-01-30  发布在  其他
关注(0)|答案(1)|浏览(195)

我正在尝试在Rust中实现特征diesel::Insertable<table
单位:mail.rs

diesel::insert_into(mailing_list).values(
         email // This is a String
        ).execute(connection);

这是因为以下代码会导致此错误:

error[E0277]: the trait bound `std::string::String: diesel::Insertable<table>` is not satisfied
   --> src/mail.rs:18:10
    |
17  |     diesel::insert_into(mailing_list).values(
    |                                       ------ required by a bound introduced by this call
18  |          email
    |          ^^^^^ the trait `diesel::Insertable<table>` is not implemented for `std::string::String`

再多看一点Diesel的文档,我认为应该创建一个派生Insertable的结构体
models.rs

#[derive(Insertable)]
 pub struct NewSubscriber {
     pub email: String
}

但是我得到了

but im getting this error
error[E0433]: failed to resolve: use of undeclared crate or module `new_subscribers`
  --> src/models.rs:13:12
   |
13 | pub struct NewSubscriber {
   |            ^^^^^^^^^^^^^ use of undeclared crate or module `new_subscribers`

我很困惑为什么编译器说它找不到我试图定义的带有结构体的板条箱或模块。

wj8zmpe1

wj8zmpe11#

Insertable derive宏的文档中:
要实现Insertable,此派生需要知道相应的表类型。默认情况下,它使用snake_case类型名称,并从当前作用域添加s。可以使用#[diesel(table_name = something)]更改此默认值。
所以你需要用table!定义一个“new_subscriber”表,如果你已经这样做了,确保你把它导入到作用域中,或者如果你已经有一个表并且它在作用域中但是有一个不同的名字,添加上面的属性。
根据insert语句判断,要插入的表看起来像是mailing_list,所以使用最后一个选项:

#[derive(Insertable)]
#[diesel(table_name = mailing_list)]
pub struct NewSubscriber {
    pub email: String
}

相关问题