Golang中如何实现类似Python的Couchbase N1QL查询结果获取

Golang中如何实现类似Python的Couchbase N1QL查询结果获取 谁能帮助我使用Go语言从n1ql查询中获取记录,就像在Python中那样(例如:row.id、row.maxCAS):

我参考了这个论坛中也建议的链接,但无法正确实现,总是遇到这样或那样的错误。(https://github.com/couchbaselabs/beersample-go/blob/1a64b11b3f7acf59564f052f59ad66b316632b45/beersample.go#L21)

在Python中:
query = select meta().id,round((META().cas)/1000000000) as maxCAS,Expiretime from bucketname where Expiretime='10000';

recs = bucket.n1ql_query(N1QLQuery(query))
    for rec in recs:
        try:
            v_rec_count=v_rec_count+1
            print rec      //   {u'Expiretime': u'3600', u'id': u'userid,poc', u'maxCAS': 1591037838}
            key=rec['id'].strip()  // 结果:userid,poc
			key=rec['Expiretime'].strip()  // 结果:3600
            print key
			
在Go中:

myQuery := gocb.NewN1qlQuery(query)
rows, err := bucket.ExecuteN1qlQuery(myQuery, nil)
    for rows.Next(&row) {
       fmt.Printf("Row: %+v\n", row)  // map[Expiretime:3600 id:userid,poc maxCAS:1.591037838e+09]-->如何像在Python中那样只获取id、expiretime、cas值
    }

更多关于Golang中如何实现类似Python的Couchbase N1QL查询结果获取的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中如何实现类似Python的Couchbase N1QL查询结果获取的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,你可以通过定义一个结构体来映射N1QL查询结果,或者使用map[string]interface{}来动态处理。以下是两种实现方式:

方法1:使用结构体映射(推荐)

type QueryResult struct {
    ID         string `json:"id"`
    MaxCAS     float64 `json:"maxCAS"`
    Expiretime string `json:"Expiretime"`
}

myQuery := gocb.NewN1qlQuery(query)
rows, err := bucket.ExecuteN1qlQuery(myQuery, nil)
if err != nil {
    log.Fatal(err)
}
defer rows.Close()

var row QueryResult
for rows.Next(&row) {
    fmt.Printf("ID: %s\n", row.ID)
    fmt.Printf("MaxCAS: %f\n", row.MaxCAS)
    fmt.Printf("Expiretime: %s\n", row.Expiretime)
    
    // 如果需要去除空格(类似Python的strip())
    key := strings.TrimSpace(row.ID)
    expiretime := strings.TrimSpace(row.Expiretime)
    fmt.Printf("Trimmed ID: %s\n", key)
    fmt.Printf("Trimmed Expiretime: %s\n", expiretime)
}

方法2:使用map动态处理

myQuery := gocb.NewN1qlQuery(query)
rows, err := bucket.ExecuteN1qlQuery(myQuery, nil)
if err != nil {
    log.Fatal(err)
}
defer rows.Close()

var row map[string]interface{}
for rows.Next(&row) {
    // 直接访问字段
    id, _ := row["id"].(string)
    maxCAS, _ := row["maxCAS"].(float64)
    expiretime, _ := row["Expiretime"].(string)
    
    fmt.Printf("ID: %s\n", id)
    fmt.Printf("MaxCAS: %f\n", maxCAS)
    fmt.Printf("Expiretime: %s\n", expiretime)
    
    // 去除空格
    key := strings.TrimSpace(id)
    expTime := strings.TrimSpace(expiretime)
    fmt.Printf("Trimmed ID: %s\n", key)
    fmt.Printf("Trimmed Expiretime: %s\n", expTime)
    
    // 重置map以接收下一行
    row = make(map[string]interface{})
}

方法3:使用原始字节处理

myQuery := gocb.NewN1qlQuery(query)
rows, err := bucket.ExecuteN1qlQuery(myQuery, nil)
if err != nil {
    log.Fatal(err)
}
defer rows.Close()

for {
    var rawBytes []byte
    if !rows.NextBytes(&rawBytes) {
        break
    }
    
    var result map[string]interface{}
    if err := json.Unmarshal(rawBytes, &result); err != nil {
        log.Printf("Error unmarshaling row: %v", err)
        continue
    }
    
    id := strings.TrimSpace(fmt.Sprintf("%v", result["id"]))
    maxCAS := result["maxCAS"]
    expiretime := strings.TrimSpace(fmt.Sprintf("%v", result["Expiretime"]))
    
    fmt.Printf("ID: %s\n", id)
    fmt.Printf("MaxCAS: %v\n", maxCAS)
    fmt.Printf("Expiretime: %s\n", expiretime)
}

错误处理示例

myQuery := gocb.NewN1qlQuery(query)
rows, err := bucket.ExecuteN1qlQuery(myQuery, nil)
if err != nil {
    log.Fatalf("Query execution failed: %v", err)
}
defer rows.Close()

var row map[string]interface{}
for rows.Next(&row) {
    id, ok := row["id"].(string)
    if !ok {
        log.Printf("ID field missing or not a string: %v", row)
        continue
    }
    
    maxCAS, _ := row["maxCAS"].(float64)
    expiretime, _ := row["Expiretime"].(string)
    
    fmt.Printf("Processed - ID: %s, MaxCAS: %f, Expiretime: %s\n",
        strings.TrimSpace(id),
        maxCAS,
        strings.TrimSpace(expiretime),
    )
    
    row = make(map[string]interface{})
}

if err := rows.Err(); err != nil {
    log.Printf("Error iterating rows: %v", err)
}

这些示例展示了如何在Go中实现类似Python的N1QL查询结果处理,包括字段访问、类型转换和字符串清理操作。

回到顶部