使用Rust+Actix+sqlx连接SQL Server时遇DecimalN类型不支持错误求助
解决sqlx 0.6.3连接SQL Server时的DecimalN类型不支持问题
错误原因
你遇到的proc macro panicked: not implemented: name: unsupported data type DecimalN错误,是因为sqlx的query!编译时宏在解析my_table的返回字段时,遇到了SQL Server的DECIMAL/NUMERIC类型(内部标识为DecimalN),而sqlx 0.6.3的MSSQL驱动尚未实现该类型的自动推导,导致宏在编译阶段panic。
解决方案
方案1:改用无类型查询query方法
放弃编译时类型检查,使用运行时的query方法绕开类型推导问题,适合快速验证或字段较多的场景:
// 替换原有的query!代码块 let result = sqlx::query("SELECT * From my_table") .fetch_all(&mut connection) .await?; // 手动提取字段,以DECIMAL类型字段为例 for row in result { // 尝试获取名为"your_decimal_column"的字段,映射为sqlx::Decimal let decimal_val: Option<sqlx::Decimal> = row.try_get("your_decimal_column").unwrap(); println!("Decimal字段值: {:?}", decimal_val); }
方案2:在query!中显式指定字段类型
如果需要保留编译时类型安全,可以显式列出字段并为DECIMAL类型指定映射,告诉sqlx如何处理该类型:
let result = sqlx::query!( r#" SELECT id, your_decimal_column as "your_decimal_column!: Decimal" From my_table "# ) .fetch_all(&mut connection) .await?; // 正常访问强类型的字段 for row in result { println!("ID: {}, Decimal值: {:?}", row.id, row.your_decimal_column); }
这里的语法字段名 as "别名!: 类型"是sqlx的类型重写语法,强制将字段映射为sqlx::Decimal类型。
方案3:升级sqlx版本(推荐)
sqlx 0.7及以上版本对MSSQL的DECIMAL类型支持进行了完善,升级后query!宏可以自动处理该类型。注意升级后需要适配API变化,比如连接方式可能改为sqlx::MssqlPool而非直接使用MssqlConnection。
验证步骤
- 先执行只包含非DECIMAL字段的查询(比如
SELECT id, name From my_table),确认是否还会触发错误,以此验证DECIMAL类型是问题根源。 - 确保
sqlx::Decimal已被引入(需要在Cargo.toml中启用decimal特性:sqlx = { version = "0.6.3", features = ["mssql", "decimal"] })。
内容的提问来源于stack exchange,提问作者pbuort
相关产品推荐
相关产品推荐

