# 查看数据看板和图表结果

从看板列表取得看板 ID，读取图表定义，再查询指定图表的执行结果。

(sdk-ai-studio-dashboard-prepare)=
## 准备

1. [配置 SDK 和个人访问令牌](../../../quickstart/ai-studio/sdk.md#sdk-ai-studio-quickstart-configure)。
2. [选择工作区并获取工作区 ID](../../../quickstart/ai-studio/sdk.md#sdk-ai-studio-quickstart-workspaces)。


(sdk-ai-studio-dashboard-s1)=
## 读取看板及图表结果

示例读取一页看板，并查询首个看板中首个图表的执行结果。

:::::{tab-set}
:sync-group: sdk-language

::::{tab-item} Python
:sync: python

```python
import os

import moi_product_sdk as sdk

client = sdk.new_with_personal_access_token(
    os.environ["PRODUCT_API_BASE_URL"], os.environ["PRODUCT_API_KEY"]
)
workspace_id = os.environ["WORKSPACE_ID"]
workspace = client.workspace(workspace_id)
service = client.dashboard(workspace_id)
page = service.list(sdk.DataDashboardListRequest(page_size=20))
for item in page.items:
    print(item.id, item.name)
print("是否还有下一页:", page.has_more, "下一页标记:", page.next_page_token)
if not page.items:
    raise SystemExit("当前页没有看板")
dashboard = service.get(page.items[0].id)
for chart in dashboard.charts:
    print("图表:", chart.id, chart.name)
if not dashboard.charts:
    raise SystemExit("所选看板没有图表")
execution = service.chart_result(dashboard.id, dashboard.charts[0].id)
print("执行 ID:", execution.execution_id)
print("状态:", execution.status, "错误:", execution.error)
print("查询结果:", execution.result)
```

::::

::::{tab-item} Go
:sync: go

```go
package main

import (
	"context"
	"fmt"
	"os"

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

func main() {
	ctx := context.Background()
	client, err := sdk.NewWithPersonalAccessToken(os.Getenv("PRODUCT_API_BASE_URL"), os.Getenv("PRODUCT_API_KEY"))
	if err != nil {
		panic(err)
	}
	workspaceID := os.Getenv("WORKSPACE_ID")
	workspace, err := client.Workspace(workspaceID)
	if err != nil {
		panic(err)
	}
	_ = workspace
	service := client.Dashboard(workspaceID)
	page, err := service.List(ctx, &sdk.DataDashboardListRequest{PageSize: 20})
	if err != nil {
		panic(err)
	}
	for _, item := range page.GetItems() {
		fmt.Println(item.GetId(), item.GetName())
	}
	fmt.Println("是否还有下一页:", page.GetHasMore(), "下一页标记:", page.GetNextPageToken())
	if len(page.GetItems()) == 0 {
		fmt.Println("当前页没有看板")
		return
	}
	dashboard, err := service.Get(ctx, page.GetItems()[0].GetId())
	if err != nil {
		panic(err)
	}
	for _, chart := range dashboard.GetCharts() {
		fmt.Println("图表:", chart.GetId(), chart.GetName())
	}
	if len(dashboard.GetCharts()) == 0 {
		fmt.Println("所选看板没有图表")
		return
	}
	execution, err := service.ChartResult(ctx, dashboard.GetId(), dashboard.GetCharts()[0].GetId())
	if err != nil {
		panic(err)
	}
	fmt.Println("执行 ID:", execution.GetExecutionId())
	fmt.Println("状态:", execution.GetStatus(), "错误:", execution.GetError())
	fmt.Println("查询结果:", execution.GetResult())
}
```

::::

:::::

(sdk-ai-studio-dashboard-limit)=
(sdk-ai-studio-dashboard-next)=
根据图表的执行状态和错误信息检查查询结果。继续列出看板时，将返回的下一页标记传入列表请求，并保持其他查询条件不变。
