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

使用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(&timestamp, &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(&timestamp, &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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:00:02