Странная ошибка при вставке значения с дизелем и можжевельником

#rust #rust-diesel

Вопрос:

В настоящее время я создаю небольшой бэкэнд с actix-web, juniper и diesel. В основном он основан на этом уроке : https://dev.to/youroff/ultra-fast-backend-with-rust-26ac но я кое-что изменил.

Я закончил «читать» часть API, но у меня ошибка в части «создать».

 impl MutationRoot {
    fn create_contraption(
        context: amp;Context,
        new_contraption: ContraptionInput,
    ) -> FieldResult<Contraption> {
        use crate::schema::contraptions;

        let conn = context.dbpool.get().map_err(|_| {
            FieldError::new("Could not open connection to the database", Value::null())
        })?;

        diesel::insert_into(contraptions::table)
            .values(amp;new_contraption)
            .get_result(amp;conn)
            .expect("Could not create new contraptions")
    }
}
 

Вот результат cargo check

     Checking redstone_contraptions_backend v0.1.0 (/home/stowy/Documents/dev/rust/Redstone-Contraptions/redstone_contraptions_backend)
error[E0277]: the trait bound `Result<Contraption, FieldError>: Queryable<(Integer, diesel::sql_types::Text, diesel::sql_types::Text, diesel::sql_types::Nullable<diesel::sql_types::Text>, diesel::sql_types::Nullable<diesel::sql_types::Text>), Pg>` is not satisfied
  --> src/models/root.rs:46:14
   |
46 |             .get_result(amp;conn)
   |              ^^^^^^^^^^ the trait `Queryable<(Integer, diesel::sql_types::Text, diesel::sql_types::Text, diesel::sql_types::Nullable<diesel::sql_types::Text>, diesel::sql_types::Nullable<diesel::sql_types::Text>), Pg>` is not implemented for `Result<Contraption, FieldError>`
   |
   = note: required because of the requirements on the impl of `LoadQuery<PooledConnection<ConnectionManager<PgConnection>>, Result<Contraption, FieldError>>` for `InsertStatement<table, ValuesClause<(ColumnInsertValue<columns::name, diesel::expression::bound::Bound<diesel::sql_types::Text, amp;std::string::String>>, ColumnInsertValue<columns::description, diesel::expression::bound::Bound<diesel::sql_types::Text, amp;std::string::String>>, ColumnInsertValue<columns::image, diesel::expression::bound::Bound<diesel::sql_types::Nullable<diesel::sql_types::Text>, amp;std::string::String>>, ColumnInsertValue<columns::itemslist, diesel::expression::bound::Bound<diesel::sql_types::Nullable<diesel::sql_types::Text>, amp;std::string::String>>), table>>`
 

Из того, что я понимаю, это говорит о том, что вывод .get_result(amp;conn) , который имеет тип Result<Contraption, FieldError> , не реализуется Queryable . Но это нормально , так как это Result тип, а не Contraption тип, вот почему я поставил .expect() потом.

И Contraption реализует Queryable :

 #[derive(Default, Queryable)]
pub struct Contraption {
    pub id: i32,
    pub name: String,
    pub description: String,
    pub image: Option<String>,
    pub itemslist: Option<String>,
}

#[derive(GraphQLInputObject, Insertable)]
#[graphql(description = "Contraption Input")]
#[table_name = "contraptions"]
pub struct ContraptionInput {
    pub name: String,
    pub description: String,
    pub image: Option<String>,
    pub itemslist: Option<String>,
}
 

Вот мои зависимости на всякий случай :

 [dependencies]
actix = "0.12.0"
actix-web = "3.3.2"
juniper = "0.15.7"
diesel = { version = "1.4.7", features = ["postgres", "r2d2"] }
dotenv = "0.15.0"
r2d2 = "0.8.9"
serde_json = "1.0.67"
 

Что я делаю не так?

Ответ №1:

Мне просто нужно было добавить a .map_err() вместо .expect() и уточнить тип вывода .get_result() .

 diesel::insert_into(contraptions::table)
    .values(amp;new_contraption)
    .get_result::<Contraption>(amp;conn)
    .map_err(|_| FieldError::new("Error creating contraption", Value::null()))