查询历史

对外 SDK 通过同步辅助方法执行 SQL:

  • Python:SDKClient.run_sql(statement)

  • Go:(*SDKClient).RunSQL(ctx, statement)

两者都会调用 Catalog 服务的 NL2SQL run_sql 操作。SQL 必须使用 analytics.orders 这样的完全限定表名,服务据此确定目标数据库。

使用 Python 执行查询

先用已认证的 RawClient 创建高层客户端:

import os

from moi import RawClient, SDKClient

raw = RawClient(
    base_url=os.environ["MOI_BASE_URL"],
    api_key=os.environ["MOI_API_KEY"],
)
client = SDKClient(raw)

response = client.run_sql(
    "SELECT order_id, total "
    "FROM analytics.orders "
    "ORDER BY order_id DESC "
    "LIMIT 20"
)

for result in response.get("results", []):
    print(result.get("columns", []))
    for row in result.get("rows", []):
        print(row)

Python 客户端把响应数据解码为字典和列表。不要让应用逻辑依赖文档未说明的响应 Envelope 字段。

对应的底层调用如下:

response = raw.run_nl2sql(
    {
        "operation": "run_sql",
        "statement": "SELECT COUNT(*) FROM analytics.orders",
    }
)

直接执行 SQL 时优先使用 SDKClient.run_sql:该方法会拒绝空语句,并自动设置 操作类型。

使用 Go 执行查询

package main

import (
	"context"
	"fmt"
	"log"
	"os"

	sdk "github.com/matrixorigin/moi-go-sdk"
)

func main() {
	raw, err := sdk.NewRawClient(
		os.Getenv("MOI_BASE_URL"),
		os.Getenv("MOI_API_KEY"),
	)
	if err != nil {
		log.Fatal(err)
	}
	client := sdk.NewSDKClient(raw)

	response, err := client.RunSQL(
		context.Background(),
		"SELECT order_id, total "+
			"FROM analytics.orders "+
			"ORDER BY order_id DESC LIMIT 20",
	)
	if err != nil {
		log.Fatal(err)
	}

	for _, result := range response.Results {
		fmt.Println(result.Columns)
		for _, row := range result.Rows {
			fmt.Println(row)
		}
	}
}

Go 返回 *NL2SQLRunSQLResponse。每个 NL2SQLResult 包含 Columns []stringRows []NL2SQLRow,其中一行是字符串切片。

按已发布的接口契约设计

Python 和 Go 对外仓库中的 run_sql 当前都不返回查询 Handle 或 Statement ID, 也没有公开以下 SDK 方法:

  • 异步查询轮询或结果流式读取;

  • 结果分页或下载;

  • 取消或终止正在运行的语句;

  • 读取 SQL 历史或执行计划。

因此,重试策略由应用负责。网络错误不能证明服务端从未接收语句。对于可能修改 数据的 SQL,除非语句及其所在流程明确具备幂等性,否则不要自动重试。

官方示例每次只提交一条语句;对外 SDK 文档没有承诺多语句或事务语义。应将语句 拆开调用;如果应用必须控制会话或事务,请使用数据库 Driver。

保存应用真正需要的记录

调用方如果需要自己的查询记录,应在调用 SDK 前准备并保存:

  • 应用生成的请求 ID;

  • 完整 SQL 或脱敏后的 SQL;

  • 所选数据库和表的元数据 ID;

  • 开始和结束时间;

  • 成功或失败状态,以及脱敏后的错误;

  • 允许持久化的结果摘要。

不要记录 API Key 或不受限制的结果行。错误分类和请求 ID 的处理方式见 响应、错误与分页。AI Studio 运维人员可以在 SQL 历史中查看界面侧记录,但该功能不会为 对外 SDK 增加查询历史方法。

保存 SQL 和记录查询历史是两个不同问题。设计持久化方案前,请先阅读 工作簿能力边界