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
相关产品推荐
相关产品推荐

