driver-go icon indicating copy to clipboard operation
driver-go copied to clipboard

问题:go程序超表查询不到数据问题,通过taos命令行工具可以查询到,程序debug时偶尔可以查询到。

Open coral-kourou opened this issue 2 years ago • 5 comments

问题:go程序超表查询不到数据问题,通过taos命令行工具可以查询到,程序debug时偶尔可以查询到。 场景:超表包含多个子表,每个子表有3列数据,每列均有数据。 通过go程序执行超表查询平均值sql如下,程序执行后debug分步运行程序偶尔可以查询到数据,直接运行程序查询不到数据,通过taos命令行直接执行以下SQL可以查询到数据。 select avg(ed1) as avged1 from db_e.group1 where aaa2 = 'bbb2' and ts >= '1646359200000' and ts < '1646366400000' interval(1h) td版本:2.2.2.10 go语言客户端:2.0.1 操作系统:Ubuntu / ARM td参数:除了存储时间,其他未更改。

coral-kourou avatar Jun 28 '22 09:06 coral-kourou

@coral-kourou 请提供测试样本和代码

huskar-t avatar Jun 28 '22 09:06 huskar-t

@coral-kourou 请提供测试样本和代码

超表 group1

子表([]内为标签) sub1 [aaa2=123] sub2 [aaa2=bbb2] sub3 [aaa2=bbb2]

建表语句 CREATE STABLE group1 (ts TIMESTAMP, ed1 DOUBLE) TAGS (aaa2 NCHAR(12)); CREATE TABLE sub1 USING group1 TAGS (123); CREATE TABLE sub2 USING group1 TAGS (bbb2); CREATE TABLE sub3 USING group1 TAGS (bbb2);

简化后出现问题的程序逻辑

//下方获取tdEngine并不是每次都创建,而是程序初始化时创建一次连接。 tdEngine, err := m.HSDBOpen("taosSql", taosUrl) //下方代码复用上方创建的tdEngine,执行SQL。 rows, err := tdEngine.Query("select avg(ed1) as avged1 from db_test.group1 where aaa2 = 'bbb2' and ts >= '1646359200000' and ts < '1646366400000'") if err != nil { log.Logger.Debug(fmt.Sprintf("db query error: %s\n", err)) return "", nil, err } defer rows.Close() cols, err := rows.Columns() if err != nil || len(cols) < 2 { log.Logger.Debug(fmt.Sprintf("get columns error: %s\n", err)) return "", nil, errors.New(fmt.Sprintf("get columns error: %s\n", err)) } for rows.Next() { //读取数据,程序无法进入到此处。仅有debug时偶尔会进入。

}

coral-kourou avatar Jun 29 '22 02:06 coral-kourou

@coral-kourou 将 go.mod require 进行如下修改: github.com/taosdata/driver-go/v2 develop 之后执行 go mod tidy 再重新测试,看看是否出现问题

huskar-t avatar Jun 29 '22 02:06 huskar-t

@coral-kourou 将 go.mod require 进行如下修改: github.com/taosdata/driver-go/v2 develop 之后执行 go mod tidy 再重新测试,看看是否出现问题

该方式并不能解决该问题。 经过测试验证发现了可能原因:程序中存在写入后立即查询的场景,而cli或者go sdk提供的SQL写入功能会返回写入成功,实际此时数据库并未写入成功,执行查询时查不到数据。 我们在写入和查询逻辑中间增加了10秒休眠后,程序可以正常查询到数据,由此推断调用写入接口虽然返回的写入成功但数据库实际依旧在操作写入,此时存在一个空档期,无法查询到数据。如果这里推断正确,请关闭该issue,也麻烦在文档中标注下写入返回提示并非真正已写入。

coral-kourou avatar Jul 01 '22 08:07 coral-kourou

@coral-kourou 将 go.mod require 进行如下修改: github.com/taosdata/driver-go/v2 develop 之后执行 go mod tidy 再重新测试,看看是否出现问题

该方式并不能解决该问题。 经过测试验证发现了可能原因:程序中存在写入后立即查询的场景,而cli或者go sdk提供的SQL写入功能会返回写入成功,实际此时数据库并未写入成功,执行查询时查不到数据。 我们在写入和查询逻辑中间增加了10秒休眠后,程序可以正常查询到数据,由此推断调用写入接口虽然返回的写入成功但数据库实际依旧在操作写入,此时存在一个空档期,无法查询到数据。如果这里推断正确,请关闭该issue,也麻烦在文档中标注下写入返回提示并非真正已写入。

从设计角度不太可能是 connector 的问题

sangshuduo avatar Jul 01 '22 09:07 sangshuduo