使用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
相关产品推荐
相关产品推荐

