为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:linux系统,用了docker镜像
【CPU】:16c 64g
【问题描述】*:Golang在使用db.dmclob接收数据时,
1、只要用了ReadString方法读取,就会报rows.Next空指针异常。如果不用ReadString,只读取了其他数据,是可以正常的;
2、还有一种情况是 如果数据库只有一条记录,用了ReadString读取也是正常的,多条记录就会报错。
具体报错信息在下面:
GOPATH=/home/doubles/gopath/src/test:/home/doubles/go #gosetup
/usr/lib/go-1.13/bin/go build -o /tmp/GoLand/___go_build_pushtool_dameng pushtool/dameng #gosetup
/tmp/GoLand/___go_build_pushtool_dameng
db init success
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x7 pc=0x6b9117]
goroutine 1 [running]:
math/big.(*Float).Append(0x0, 0xc000022ca0, 0x0, 0xa, 0x66, 0xffffffffffffffff, 0x0, 0x0, 0x20300000000000)
/usr/lib/go-1.13/src/math/big/ftoa.go:65 +0x37
math/big.(*Float).Text(...)
/usr/lib/go-1.13/src/math/big/ftoa.go:52
github.com/dm8/dm.(*column).getColumnData(0xc000565ab8, 0xc000508126, 0x5, 0x7e5a, 0xc00008e6c0, 0xc000565ab0, 0x5aeec4, 0x7f9ac1aa8a88, 0x0)
/home/doubles/gopath/src/jpush-src-go-64/src/www.github.com/dm8/dm/zzm.go:414 +0x61b
github.com/dm8/dm.(*innerRows).getRowData(0xc000082460, 0xc00000f080, 0x2, 0x2, 0xc000565c38, 0xc000565c28)
/home/doubles/gopath/src/jpush-src-go-64/src/www.github.com/dm8/dm/v.go:474 +0x165
github.com/dm8/dm.(*innerRows).Next(0xc000082460, 0xc00000f080, 0x2, 0x2, 0x5cff7a, 0xc000570000)
/home/doubles/gopath/src/jpush-src-go-64/src/www.github.com/dm8/dm/v.go:266 +0x175
github.com/dm8/dm.(*DmRows).next(...)
/home/doubles/gopath/src/jpush-src-go-64/src/www.github.com/dm8/dm/v.go:132
github.com/dm8/dm.(*DmRows).Next(0xc000059080, 0xc00000f080, 0x2, 0x2, 0x7f9ac1aa6338, 0x8)
/home/doubles/gopath/src/jpush-src-go-64/src/www.github.com/dm8/dm/v.go:44 +0x83
database/sql.(*Rows).nextLocked(0xc0000c2580, 0x5c0000)
/usr/lib/go-1.13/src/database/sql/sql.go:2767 +0xd5
database/sql.(*Rows).Next.func1()
/usr/lib/go-1.13/src/database/sql/sql.go:2745 +0x3c
database/sql.withLock(0xb0a300, 0xc0000c25b0, 0xc000565d90)
/usr/lib/go-1.13/src/database/sql/sql.go:3184 +0x6d
database/sql.(*Rows).Next(0xc0000c2580, 0xc000010020)
/usr/lib/go-1.13/src/database/sql/sql.go:2744 +0x87
main.main()
/home/doubles/gopath/src/jpush-src-go-64/src/pushtool/dameng/main.go:26 +0x2ff
具体代码示例:
import (
"database/sql"
"fmt"
"github.com/dm8/dm"
)
func main() {
db, err := sql.Open("dm", "dm://test:test123_ML@172.17.8.26:5236")
if err != nil {
fmt.Println(err)
return
} else {
fmt.Println("db init success")
}
sqlstr := "select msg_id, json_string from t_push_list "
rows, err := db.Query(sqlstr)
if err != nil {
fmt.Println(err)
return
}
defer rows.Close()
for rows.Next() {
var msgId sql.NullInt64
var dmJsonStr dm.DmClob
err = rows.Scan(&msgId, &dmJsonStr)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(msgId.Int64)
l, err := dmJsonStr.GetLength()
fmt.Println(l, err)
data, err := dmJsonStr.ReadString(1, int(l))
fmt.Println(data, err)
}
}
查询多行结果集参考下这个示例,https://eco.dameng.com/docs/zh-cn/app-dev/go-go.html