执行 SQL 并读取查询结果¶
使用 AI Studio SDK 在指定数据库中提交 SQL,并使用服务端返回的查询记录读取语句结果。需要保存 SQL 时,可创建工作簿和版本;工作簿与查询是相互独立的资源。
任务流程¶
选择目标数据库并准备 SQL 文本;必要时先读取数据库和表的元数据。
提交 SQL 后,保存服务端返回的查询 ID。
读取查询记录,从其中取得语句 ID。
使用语句 ID 读取结果、详情或执行画像。
查询 ID 与语句 ID 不可互换。只有查询记录包含语句 ID 时,才能继续读取该语句的结果。
准备¶
需要的内容 |
在本页中的作用 |
|---|---|
已绑定目标工作区的客户端上下文 |
确定 SQL 操作所属的工作区。 |
目标数据库名称 |
确定 SQL 的执行目标。 |
SQL 文本 |
提交查询或保存工作簿版本。 |
可选的工作簿名称 |
保存 SQL 时创建工作簿。 |
写入、删除和数据定义语句会影响数据。运行前确认 SQL 文本、目标工作区、数据库和权限。
提交 SQL 并读取结果¶
示例先创建一个工作簿版本,再提交 SQL。提交返回查询 ID,不返回结果行;查询记录提供语句 ID,结果读取使用该语句 ID。
import (
"context"
"fmt"
sdk "github.com/matrixorigin/matrixflow/sdk/go-sdk"
)
func runSQL(ctx context.Context, workspace *sdk.WorkspaceHandle, databaseName, workbookName, sqlText string) error {
metadata := workspace.SQLMetadata()
database, err := metadata.Database(databaseName)
if err != nil {
return err
}
if _, err := database.Tables(ctx); err != nil {
return err
}
workbook, createdWorkbook, err := workspace.CreateSQLWorkbook(ctx, workbookName)
if err != nil {
return err
}
if workbook.ID() != createdWorkbook.GetWorkbookId() {
return fmt.Errorf("workbook handle and result do not match")
}
version, createdVersion, err := workbook.CreateVersion(ctx, sqlText)
if err != nil {
return err
}
if version.ID() != createdVersion.GetId() {
return fmt.Errorf("workbook version handle and result do not match")
}
if err := version.Save(ctx); err != nil {
return err
}
query, started, err := workspace.ExecuteSQL(
ctx, sqlText, sdk.WithSQLQueryDBName(databaseName), sdk.WithSQLQueryLimit(100),
)
if err != nil {
return err
}
if query.ID() != started.GetQueryId() {
return fmt.Errorf("query handle and result do not match")
}
described, err := query.Describe(ctx)
if err != nil {
return err
}
if described.GetStatementId() == "" {
return fmt.Errorf("query %q has no statement id", query.ID())
}
statement, err := workspace.SQLStatement(described.GetStatementId())
if err != nil {
return err
}
result, err := statement.Result(ctx, sdk.WithSQLResultLimit(100))
if err != nil {
return err
}
_ = result
return nil
}
import moi_product_sdk as sdk
def run_sql(workspace, database_name, workbook_name, sql_text):
metadata = workspace.sql_metadata()
database = metadata.database(database_name)
database.tables()
workbook, created_workbook = workspace.create_sql_workbook(workbook_name)
if workbook.id != created_workbook.workbook_id:
raise RuntimeError("workbook handle and result do not match")
version, created_version = workbook.create_version(sql_text)
if version.id != created_version.id:
raise RuntimeError("workbook version handle and result do not match")
version.save()
query, started = workspace.execute_sql(
sql_text,
sdk.with_sql_query_db_name(database_name),
sdk.with_sql_query_limit(100),
)
if query.id != started.query_id:
raise RuntimeError("query handle and result do not match")
described = query.describe()
if not described.statement_id:
raise RuntimeError(f"query {query.id} has no statement id")
statement = workspace.sql_statement(described.statement_id)
return statement.result(sdk.with_sql_result_limit(100))
结果对象包含当前结果读取的分页信息和结果数据。需要检查执行记录或执行画像时,继续使用同一语句 ID 读取对应信息。
限制¶
工作簿、查询和语句都需要已有 ID;空 ID 会在客户端被拒绝。
取消查询是独立操作。已结束查询的取消可能被拒绝,因此先读取查询记录确认状态。
删除数据库、表、视图或工作簿会影响对应对象;删除工作簿后不要继续使用原对象。
下一步¶
管理 SQL、工作簿和 SQL 历史的 HTTP 接口以 API Reference 中的数据处理接口为准。
最后更新于