You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Postgres 15+Rust 1.70+Diesel 2.0:INSERT后get_results未返回插入行

问题:PostgreSQL + Diesel INSERT后get_results返回空数组

在Postgres 15、Rust 1.70.0和Diesel 2.0环境下,可成功向assets表插入数据,但执行INSERT语句后调用get_results<Asset>返回空数组;执行SELECT语句时get_results能正常返回对应行数组。Asset结构体已派生#[derive(QueryableByName)],不清楚问题所在,请求指导。

测试代码

#[test]
fn test_get_result(){
     use crate::service_tests::prelude::connection_without_transaction;
     use diesel::sql_query;
     use diesel::RunQueryDsl;

     use crate::models::asset::Asset;

     let mut connection = connection_without_transaction();

     let query = "Select * from assets";
     let result1 = diesel::sql_query(query)
                            .get_results::<Asset>(&mut connection)
                            .unwrap();
    dbg!(result1.len());

    let query = "insert into assets (
        parent_assetcode,category_code,label_code,
        erp_code,name,description,is_depreciable,
        physical_id,machine_tag_no,in_store,
        quantity,is_multiple_entries,group_qty,
        acquired_value,acquired_date,date_put_to_use,
        physical_verification,asset_type,asset_user,
        cost_center_code,department_code,branch_code,
        location_code,physical_location_code,requires_maintenance,
        created_user_id,remarks
        )
        values
        (
            'BL00000SP','BLD','L-BLD-2','BL00000SP',
            'name of asset','descr',false,'aaaa',
            'mactag',true,1200,false,10,13250.0,
            '2023-05-01','2023-05-02',true,'Owned',
            1,'162','NA','MA003','276 VMART PATNA KURJI',
            'NA',false,1,'remarksss'
        )";
     let result2 = diesel::sql_query(query)
                        .get_results::<Asset>(&mut connection)
                        .unwrap();
     dbg!(result2.len());

}

测试输出

running 1 test
[src/service_tests/csv_import_test.rs:53] result1.len() = 44
[src/service_tests/csv_import_test.rs:78] result2.len() = 0
test service_tests::csv_import_test::test_get_result ... ok

解决方案

这是因为普通INSERT语句默认不会返回插入的行数据,Diesel的get_results需要查询有返回结果才能解析成Asset对象。

解决方法是修改INSERT语句,使用PostgreSQL的INSERT ... RETURNING语法,让插入操作返回刚插入的记录:

修改后的INSERT语句如下:

insert into assets (
    parent_assetcode,category_code,label_code,
    erp_code,name,description,is_depreciable,
    physical_id,machine_tag_no,in_store,
    quantity,is_multiple_entries,group_qty,
    acquired_value,acquired_date,date_put_to_use,
    physical_verification,asset_type,asset_user,
    cost_center_code,department_code,branch_code,
    location_code,physical_location_code,requires_maintenance,
    created_user_id,remarks
)
values
(
    'BL00000SP','BLD','L-BLD-2','BL00000SP',
    'name of asset','descr',false,'aaaa',
    'mactag',true,1200,false,10,13250.0,
    '2023-05-01','2023-05-02',true,'Owned',
    1,'162','NA','MA003','276 VMART PATNA KURJI',
    'NA',false,1,'remarksss'
) RETURNING *;

修改后,get_results<Asset>就能获取到刚插入的记录,result2.len()会变为1。

如果不需要返回所有字段,也可以指定具体字段(比如RETURNING id, name),只要返回字段能和Asset结构体的字段对应即可。

内容的提问来源于stack exchange,提问作者Padma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:05:15