问题

查询iotdb表A,column1,column2。

在数据库客户端dbeaver查询,column1返回值1,column2返回值0。

在python使用sql查询,column1返回值0,column2返回值1。使用多个方法读取sql结果都与dbeaver查询结果不一致。

在java使用sql查询,column1返回值1,column2返回值0。

分析

在python中使用session方式连接iotdb并进行数据查询,具体代码如下:

from iotdb.Session import Session

session = Session(IOTDB_HOST, IOTDB_PORT, IOTDB_USER, IOTDB_PASSWORD)
session.open(False)
zone = session.get_time_zone()

sql=(
    "select column1,column2"
    "from root.ln.`table1` "
    "where timestamp = 1755631605000 ;"
)
result = session.execute_query_statement(sql)

print("遍历所有结果")
while result.has_next():
    row_record_column = result.construct_row_record_from_data_frame()
    row_record_value=result.next()
    print(row_record_column,row_record_value)
    
# 关闭结果集
session.close()

调试查询result返回的是内存地址。内存地址中存储的数据可能是json格式数据,使用session的方法,construct_row_record_from_data_frame()、next()解析都有误。

解决

使用请求方式获取iotdb数据,具体代码如下:

import requests
import json
import time
import base64

# 配置信息

# 创建 Basic 认证头
auth_header = "Basic " + base64.b64encode(f"{username}:{password}".encode()).decode()

def send_request(query_statement: str) -> dict:
    """
    发送 HTTP 请求到 IoTDB 并返回响应结果
    """
    # 请求配置
    headers = {
        "Content-Type": "application/json",
        "Authorization": auth_header  # 全局变量
    }

    data = {
        "sql": query_statement
    }

    try:
        # 发送请求
        response = requests.post(
            iotdb_url,  # 全局变量
            headers=headers,
            json=data,
            timeout=10
        )

        # 处理响应
        if response.status_code == 200:
            return response.json()
        else:
            raise RuntimeError(f"Failed to execute query: {response.reason}")

    except Exception as e:
        # 等待一秒后重试
        time.sleep(1)
        return send_request(query_statement)

if __name__ == '__main__':
    while True:
        # 构建查询语句
        query_statement = """
        select column1,column2
        from root.ln.`table1` 
        where timestamp = 1755631605000 ;
        """

        # 发送请求并获取响应结果
        response = send_request(query_statement)

        # 处理响应结果
        print(response)

        # 等待 10 秒后再次查询
        time.sleep(10)

在控制台输出rsponse,结果与在数据库客户端查询结果一致。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐