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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:10:32