使用gocql读取Cassandra decimal值时遇反序列化错误求助
解决gocql读取Cassandra Decimal类型报错的问题
可能的原因及对应解决方案
1. 确认inf包的正确导入
gocql要求的inf.Dec来自github.com/go-inf/inf包,而非其他decimal类库(比如shopspring/decimal)。确保你的导入语句为:
import "github.com/go-inf/inf"
导入错误的包会导致类型不匹配,直接触发反序列化失败。
2. 使用指针类型进行Scan
gocql处理Decimal这类复杂类型时,需要指针来完成反序列化操作,修改变量声明为指针类型:
var timestamp time.Time var value_dec *inf.Dec // 改为指针类型 res := session.Query(`SELECT timestamp, value_dec FROM example.example LIMIT 3 ALLOW FILTERING`).WithContext(ctx).Iter().Scanner() for res.Next() { err = res.Scan(×tamp, &value_dec) if err != nil { log.Fatal(err) } // 使用前注意判空 if value_dec != nil { // 业务处理逻辑 } }
3. 升级gocql版本
旧版本gocql可能存在Decimal类型映射的兼容性bug,尝试升级到最新稳定版:
go get github.com/gocql/gocql@latest
4. 手动转换Decimal(备选方案)
如果上述方法无效,可以先将Decimal读取为字符串,再手动转换为inf.Dec:
var timestamp time.Time var value_str string res := session.Query(`SELECT timestamp, value_dec FROM example.example LIMIT 3 ALLOW FILTERING`).WithContext(ctx).Iter().Scanner() for res.Next() { err = res.Scan(×tamp, &value_str) if err != nil { log.Fatal(err) } var value_dec inf.Dec _, err = value_dec.SetString(value_str) if err != nil { log.Fatal(err) } // 处理转换后的value_dec }
5. 验证Cassandra中数据有效性
用cqlsh查询确认value_dec列的存储数据是合法的Decimal格式,避免因非法值导致反序列化失败:
SELECT value_dec FROM example.example LIMIT 3;
内容的提问来源于stack exchange,提问作者Mmmm
相关产品推荐
相关产品推荐

