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查询结果处理,包括字段访问、类型转换和字符串清理操作。

