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

使用Rust mysql crate时exec()执行UPDATE语句编译失败排查

问题解决:Rust mysql crate 中 conn.exec() 编译错误

核心问题

你遇到的编译错误是因为 exec() 方法需要推断一个实现了 FromRow 的类型参数 T——这个方法是为**有返回结果集的SQL语句(比如SELECT)**设计的,而你的UPDATE语句不会返回任何行,编译器无法确定T的具体类型。

另外你的SQL语句还有个小错误:参数占位符被包裹在单引号里了,这会让MySQL把:username当成普通字符串,而不是参数占位符,导致参数绑定失效。

修复步骤

  1. 修正SQL语句的参数占位符
    把带单引号的占位符改成无引号的:
"UPDATE Users SET admin = 1 WHERE username = :username;"
  1. 替换exec()为exec_drop()
    exec_drop()是mysql crate专门为**无返回结果的SQL语句(如UPDATE、INSERT、DELETE)**提供的方法,不需要指定返回类型:
conn.exec_drop(&stmt, params! {"username" => args.username})?;

完整修正后的代码片段

fn execute_sql(conn_string: String, args: Args) -> std::result::Result<(), Box<dyn Error>> {
    let sql_statement = match args.query.as_str(){
        "promote" => "UPDATE Users SET admin = 1 WHERE username = :username;",
        &_ => return Err(Box::from("query type invalid")),
    };
    println!("{}", sql_statement);

    let pool = Pool::new(conn_string.as_str())?;
    let mut conn = pool.get_conn()?;
    let stmt = conn.prep(sql_statement)?;
    conn.exec_drop(&stmt, params! {"username" => args.username})?;

    Ok(())
}

补充说明

如果你非要使用exec()(不推荐),可以手动指定T为(),但这样编译器会尝试解析无返回的结果,不如exec_drop()语义明确:

conn.exec::<(), _, _>(&stmt, params! {"username" => args.username})?;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:52:55