Rust项目突发mismatched types类型不匹配错误求助(Docker部署)
问题分析与解决方案
错误原因
编译器错误地将client.execute的参数数组推断为&[&bool]类型,而第二个参数&*user_id是&i64类型,无法匹配推断出的数组类型,触发类型不匹配错误。这种情况通常是因为依赖版本更新(如tokio-postgres或Rust编译器)后,类型推断规则变得更严格,之前隐式通过的类型现在触发了编译报错。
解决方法
方法1:显式标注参数数组类型
明确告诉编译器参数数组的元素是实现了ToSql + Sync trait的动态引用,避免错误的类型推断:
pub async fn update_is_worker(user_id: UserId, is_worker: bool) -> Result<()> { let client = PG_POOL.get().await?; let stmt = client .prepare_typed( "\ UPDATE user_profiles \ SET \ is_worker = $1 \ WHERE user_id = $2;\ ", &[Type::BOOL, Type::INT8], ) .await?; // 显式标注参数类型 let params: &[&(dyn tokio_postgres::ToSql + Sync)] = &[&is_worker, &*user_id]; client.execute(&stmt, params).await?; Ok(()) }
方法2:逐个转换参数为动态引用
将每个参数单独转换为&(dyn ToSql + Sync)类型,也可以解决类型推断问题:
client.execute(&stmt, &[ &is_worker as &(dyn tokio_postgres::ToSql + Sync), &*user_id as &(dyn tokio_postgres::ToSql + Sync), ]).await?;
额外排查点
- 检查近期是否更新了Rust编译器版本:新版本的类型推断可能更严格,导致旧代码触发编译错误。
- 检查
tokio-postgres或相关数据库依赖的版本变更:依赖版本升级可能修改了API的类型约束,引发类型不匹配。 - 确认
prepare_typed的类型参数顺序是否正确:从代码看[Type::BOOL, Type::INT8]与SQL中的$1(bool类型的is_worker)、$2(i64类型的user_id)顺序匹配,无需调整。
内容的提问来源于stack exchange,提问作者Moaz bin Mokhtar
相关产品推荐
相关产品推荐

