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

Diesel从1.4.8升级到2.0.0后类型不匹配错误如何修复?

修复Diesel 2.0.0升级后的连接类型不匹配错误

问题场景

将Diesel从1.4.8版本升级至2.0.0版本后,编写查询代码时调用get_conn()函数出现类型不匹配错误。

原查询代码

pub fn find_sub_org_cte_impl(root_menus: &Vec<Org>) -> Vec<OrgResponse>{
    let connection = config::establish_connection();
    let cte_query_sub_menus = "sql command";
    let cte_menus = sql_query(cte_query_sub_menus)
        .load::<Org>(&get_conn())
        .expect("Error find menu resource");
    return convert_org_to_tree(root_menus, &cte_menus);
}

错误提示

mismatched types
expected mutable reference `&mut _`
           found reference `&diesel::PgConnection`rustcClick for full compiler diagnostic
org_service.rs(29, 10): arguments to this function are incorrect
mod.rs(1497, 8): associated function defined here

get_conn()函数定义

use diesel::pg::PgConnection;
use rust_wheel::config::db::config;

pub fn get_conn() -> PgConnection{
    let mut connection = config::establish_connection();
    return connection;
}

修复方案

Diesel 2.0+版本对查询方法的连接参数做了变更:load等方法不再接受不可变引用,而是要求传入可变引用(&mut PgConnection),这是导致类型不匹配的核心原因。

步骤1:修改查询代码的连接使用方式

先获取可变的连接实例,再传入load方法:

pub fn find_sub_org_cte_impl(root_menus: &Vec<Org>) -> Vec<OrgResponse>{
    let cte_query_sub_menus = "sql command";
    // 获取可变的连接实例
    let mut conn = get_conn();
    let cte_menus = sql_query(cte_query_sub_menus)
        .load::<Org>(&mut conn) // 传入可变引用
        .expect("Error find menu resource");
    return convert_org_to_tree(root_menus, &cte_menus);
}

注:原代码中未使用的let connection = config::establish_connection();已删除,避免冗余。

步骤2:简化get_conn()函数

函数内的mut标记多余(返回所有权而非引用),可以简化:

use diesel::pg::PgConnection;
use rust_wheel::config::db::config;

pub fn get_conn() -> PgConnection{
    config::establish_connection()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:13:32