我正在尝试使用 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)
错误在哪里?少了什么东西?
无法回答这个问题,因为它缺少重要的细节,例如使用的柴油版本以及柴油的启用功能标志。
\n根本问题是内部.get_result()使用INSERT INTO \xe2\x80\xa6 RETURNINGSQL 语句。这些仅受 Sqlite 3.35 或更高版本支持。截至目前,对此类声明的支持背后有一个单独的柴油功能标志。您需要启用 returning_clauses_for_sqlite_3_35功能标志。
这本身并不能解决问题。.values([book])创建一个包含一个元素的数组并尝试插入该元素。这将导致diesel使用批量插入语句,该语句通常允许一次插入多个元素。虽然 sqlite 后端支持此功能,但它不能与上述返回支持结合使用,因为 SQLite 此处缺少另一个 SQL 功能(使用关键字DEFAULT来表示某个值应替换为相应的数据库默认值)。在您的情况下,只需调用 即可解决此问题.values(&book),这会构造一个普通的单行插入。
| 归档时间: |
|
| 查看次数: |
1272 次 |
| 最近记录: |