【问题标题】:Rust Diesel sql_query Insert example with ReturningRust Diesel sql_query 带有返回的插入示例
【发布时间】: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`

提前致谢

【问题讨论】:

    标签: rust rust-diesel


    【解决方案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
    猜你喜欢
    • 2022-12-10
    • 2019-04-18
    • 2020-09-06
    • 2020-11-27
    • 2020-05-18
    • 2021-12-24
    • 2022-07-14
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多