You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SurrealDB Query方法时Go语言Unmarshal无法正常工作

问题分析与解决方案

问题根源

SurrealDB的db.Query()返回的是嵌套的结果集结构(格式类似[[{"id": "...", "city": "..."}]]),而你之前用的db.Select()会自动处理嵌套层级,直接返回平级的记录数组。当你直接把Query的结果Unmarshal到[]Listing时,由于结构层级不匹配,Go的JSON解析会忽略不匹配的嵌套数据,所以既不会填充数据也不会抛出错误。

解决方案

方案1:改用db.Select()(推荐)

如果你的需求只是获取查询结果,直接用db.Select()是最简洁的方式,它会自动处理结果集的嵌套结构:

func singleRecordDynamic() {
    db := surreal.CreateConnection()
    defer db.Close()

    var listings []Listing
    err := db.Select(&listings, "SELECT * FROM listings WHERE city = $city", map[string]string{
        "city": "New York",
    })

    if err != nil {
        panic(err)
    }

    fmt.Println(listings[0])
}

方案2:保留db.Query(),适配嵌套结构

如果必须使用db.Query(),需要先将结果Unmarshal到匹配嵌套层级的结构中,再提取目标数据:

func singleRecordDynamic() {
    db := surreal.CreateConnection()
    defer db.Close()

    result, err := db.Query("SELECT * FROM listings WHERE city = $city", map[string]string{
        "city": "New York",
    })

    if err != nil {
        panic(err)
    }

    // 定义匹配Query返回结构的嵌套类型
    var queryResult [][]Listing
    err = surrealdb.Unmarshal(result, &queryResult)
    if err != nil {
        panic(err)
    }

    // 提取第一个结果集中的记录
    if len(queryResult) > 0 && len(queryResult[0]) > 0 {
        fmt.Println(queryResult[0][0])
    }
}

内容的提问来源于stack exchange,提问作者Josh Pennington

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 10:59:58