使用Rust mysql crate时exec()执行UPDATE语句编译失败排查
问题解决:Rust mysql crate 中 conn.exec() 编译错误
核心问题
你遇到的编译错误是因为 exec() 方法需要推断一个实现了 FromRow 的类型参数 T——这个方法是为**有返回结果集的SQL语句(比如SELECT)**设计的,而你的UPDATE语句不会返回任何行,编译器无法确定T的具体类型。
另外你的SQL语句还有个小错误:参数占位符被包裹在单引号里了,这会让MySQL把:username当成普通字符串,而不是参数占位符,导致参数绑定失效。
修复步骤
- 修正SQL语句的参数占位符
把带单引号的占位符改成无引号的:
"UPDATE Users SET admin = 1 WHERE username = :username;"
- 替换
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
相关产品推荐
相关产品推荐

