Diesel“get_results”给出了特征限制错误

Zer*_*rok 2 rust rust-diesel

我正在尝试使用 Diesel 制作 Actix API,并且在制作第一个端点 (/books/create) 时,我在尝试将插入的值返回到我的代码中时遇到问题。

这是我的插入内容:

use diesel::prelude::*;
use crate::models::Book;
use crate::schema::books;
use crate::db;


pub fn create_book(book: &Book) -> Book {
    
    let mut connection: SqliteConnection = db::establish_connection();
    let result: QueryResult<Book> = diesel::insert_into(books::table)
        .values([book])
        .get_result::<Book>(&mut connection);
        
    
    result.unwrap()
}
Run Code Online (Sandbox Code Playgroud)

这是错误,我将其包装在 Pastebin 中,因为它对于 Stackoverflow 来说太长: https: //pastebin.com/Evq6tUYq

我想知道这是否可能是架构或模型的问题,但据我所知,它们似乎没问题并且没有不匹配的值:

use diesel::prelude::*;
use serde::{Serialize, Deserialize};    
use crate::schema::books;

#[derive(Queryable, Serialize, Deserialize, Insertable)]
#[diesel(table_name = books)]
pub struct Book {
    pub id: i32,
    pub title: String,
    pub author: String,
    pub creation_date: Option<String>,
    pub publishing_house: Option<String>,
    pub release_date: Option<String>,
    pub cover_image: Option<String>
}



diesel::table! {
    books (id) {
        id -> Integer,
        title -> Text,
        author -> Text,
        publishing_house -> Nullable<Text>,
        release_date -> Nullable<Text>,
        cover_image -> Nullable<Text>,
        creation_date -> Nullable<Text>,
    }
}
Run Code Online (Sandbox Code Playgroud)

错误在哪里?少了什么东西?

wei*_*ich 6

无法回答这个问题,因为它缺少重要的细节,例如使用的柴油版本以及柴油的启用功能标志。

\n

根本问题是内部.get_result()使用INSERT INTO \xe2\x80\xa6 RETURNINGSQL 语句。这些仅受 Sqlite 3.35 或更高版本支持。截至目前,对此类声明的支持背后有一个单独的柴油功能标志。您需要启用 returning_clauses_for_sqlite_3_35功能标志。

\n

这本身并不能解决问题。.values([book])创建一个包含一个元素的数组并尝试插入该元素。这将导致diesel使用批量插入语句,该语句通常允许一次插入多个元素。虽然 sqlite 后端支持此功能,但它不能与上述返回支持结合使用,因为 SQLite 此处缺少另一个 SQL 功能(使用关键字DEFAULT来表示某个值应替换为相应的数据库默认值)。在您的情况下,只需调用 即可解决此问题.values(&book),这会构造一个普通的单行插入。

\n