Skip to content

数据导出

Go Cursor SDK 提供了强大的数据导出功能,支持将数据导出为 JSON、CSV 等多种格式。

基本用法

go
import cursor "github.com/vibe-coding-labs/go-cursor-sdk"

// 获取导出器
exporter := client.Export()

导出格式

导出为 JSON

go
// 导出会话为 JSON
sessions, err := client.Sessions().ListSessions()
if err != nil {
    log.Fatal(err)
}

err = exporter.ExportSessionsJSON(sessions, "sessions.json")
if err != nil {
    log.Fatal(err)
}

导出为 CSV

go
// 导出统计数据为 CSV
stats, err := client.Stats().GetStatsRange(startDate, endDate)
if err != nil {
    log.Fatal(err)
}

err = exporter.ExportStatsCSV(stats, "stats.csv")
if err != nil {
    log.Fatal(err)
}

批量导出

导出所有数据

go
// 导出所有数据到指定目录
err := exporter.ExportAll("./export", client)
if err != nil {
    log.Fatal(err)
}

这将创建以下文件结构:

export/
├── sessions.json
├── composers.json
├── stats.csv
├── config.json
├── terminal_history.json
└── mcp_services.json

自定义导出

go
// 导出特定类型的数据
err := exporter.ExportSessions("./export/sessions.json", client)
err = exporter.ExportComposers("./export/composers.json", client)
err = exporter.ExportStats("./export/stats.csv", client)

实际示例

导出最近的会话

go
// 查询最近 7 天的会话
query := cursor.NewQueryBuilder().
    TimeRange(
        time.Now().AddDate(0, 0, -7),
        time.Now(),
    ).
    Build()

sessions, err := client.Sessions().QuerySessions(query)
if err != nil {
    log.Fatal(err)
}

// 导出为 JSON
err = exporter.ExportSessionsJSON(sessions, "recent_sessions.json")
if err != nil {
    log.Fatal(err)
}

导出统计报告

go
// 获取月度统计
stats, err := client.Stats().GetStatsRange(
    time.Now().AddDate(0, -1, 0), // 一个月前
    time.Now(),
)
if err != nil {
    log.Fatal(err)
}

// 导出为 CSV
err = exporter.ExportStatsCSV(stats, "monthly_report.csv")
if err != nil {
    log.Fatal(err)
}

导出 MCP 服务配置

go
// 获取 MCP 服务数据
mcpData, err := client.MCPService().GetMCPServiceData()
if err != nil {
    log.Fatal(err)
}

// 导出为 JSON
err = exporter.ExportMCPServicesJSON(mcpData, "mcp_services.json")
if err != nil {
    log.Fatal(err)
}

自定义导出格式

使用自定义编码器

go
// 自定义 JSON 编码
encoder := json.NewEncoder(file)
encoder.SetIndent("", "  ")
err := encoder.Encode(data)

导出为其他格式

go
// 导出为 YAML
import "gopkg.in/yaml.v3"

data, err := client.Sessions().ListSessions()
if err != nil {
    log.Fatal(err)
}

file, err := os.Create("sessions.yaml")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

encoder := yaml.NewEncoder(file)
err = encoder.Encode(data)

错误处理

go
err := exporter.ExportAll("./export", client)
if err != nil {
    switch {
    case errors.Is(err, cursor.ErrExportFailed):
        log.Fatal("导出失败")
    case errors.Is(err, cursor.ErrFileWrite):
        log.Fatal("文件写入失败")
    default:
        log.Fatal(err)
    }
}

性能优化

流式导出大数据集

go
// 分批导出大量数据
pageSize := 1000
page := 0

file, err := os.Create("large_export.json")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

encoder := json.NewEncoder(file)

for {
    query := cursor.NewQueryBuilder().
        Offset(page * pageSize).
        Limit(pageSize).
        Build()
    
    sessions, err := client.Sessions().QuerySessions(query)
    if err != nil {
        log.Fatal(err)
    }
    
    if len(sessions) == 0 {
        break
    }
    
    for _, session := range sessions {
        if err := encoder.Encode(session); err != nil {
            log.Fatal(err)
        }
    }
    
    page++
}

下一步

Released under the MIT License.