Rust Diesel sql_query 带有返回的插入示例

Posted

技术标签:

【中文标题】Rust Diesel sql_query 带有返回的插入示例【英文标题】:Rust Diesel sql_query Insert example with Returning 【发布时间】:2021-10-31 12:40:44 【问题描述】:

我正在尝试使用 Diesel sql_query 进行插入并返回插入记录的 ID,但出现错误

这是我的代码

let demo_id: Vec<i32> = sql_query("insert into demo (demoname, description, demovalue) values (?, ?, 2) returning demoid")            
            .bind::<Text, _>("Demo1")
            .bind::<Text, _>("Demo2")
            .get_results(&conn).unwrap();

遇到错误

the trait `QueryableByName<Pg>` is not implemented for `i32`

提前致谢

【问题讨论】:

【参考方案1】:

正如sql_query 的文档中所说:

与 Diesel 中的大多数查询不同,sql_query 将通过以下方式反序列化其数据 名称,而不是索引。这意味着您不能反序列化为 元组,以及您从此函数反序列化的结构将需要 有#[derive(QueryableByName)]

因此,您必须为要反序列化的数据创建一个结构:


#[derive(QueryableByName)]
struct InsertedRowId 
    #[sql_type = "Integer"]
    demoid: i32


// Then:

let demo_id: Vec<InsertedRowId> = sql_query("insert into demo (demoname, description, demovalue) values ($1, $2, 2) returning demoid")            
            .bind::<Text, _>("Demo1")
            .bind::<Text, _>("Demo2")
            .get_results(&conn).unwrap();

请注意,查询中返回的列的名称必须与相应的结构字段同名。

另请参阅QueryableByName 的文档。

最后 - 请注意,对于 postgresql,查询中的占位符使用语法 $1$2 等指定

【讨论】:

谢谢,这几乎可以工作,您只需将 sql 类型添加到 struct #[derive(QueryableByName)] struct InsertedRowId #[sql_type = "Integer"] deroid: i32 现在我有了它工作:),请更新答案,我将标记为正确, @Gonzalo 答案已更新。 还发现对于 postgres 不是?但是sql语句中的$1, $2

以上是关于Rust Diesel sql_query 带有返回的插入示例的主要内容,如果未能解决你的问题,请参考以下文章

返回使用 Rocket 和 Diesel (Rust) 在 PostgreSQL 中创建的单个记录

使用 r2d2 在 rust/diesel 应用程序中实现连接池

Rust Diesel Abstract 更新函数

Rust Diesel 未构建错误使用未声明的板条箱或模块

Rust Diesel 原始 SQL 给出错误“`std::result::Result<Vec<T>,diesel::result::Error>` 所需的类型注释”

Rust Diesel:特征绑定 `NaiveDateTime: Deserialize<'_>` 不满足