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 原始 SQL 给出错误“`std::result::Result<Vec<T>,diesel::result::Error>` 所需的类型注释”