在 golang Couchbase SDK 中,有 N1QL 选择示例,其中包含如下示例:
myQuery := gocb.NewN1qlQuery("SELECT airportname, city, country FROM `travel-sample` " +
"WHERE type='airport' AND city=$1 ")
myParams = append(myParams, []interface{}{"Reno"})
rows, err := bucket.ExecuteN1qlQuery(myQuery, myParams)
当我尝试使用以下内容时,它没有找到任何记录。
query := gocb.NewN1qlQuery("SELECT * FROM `bucket` WHERE META().id LIKE 'TD:$1:%'")
rows, err := r.Bucket.ExecuteN1qlQuery(query, []interface{}{userid})
if err != nil {
return nil, err
}
但这确实有效,并且在 Couchbase 控制台中也有效:
query := gocb.NewN1qlQuery("SELECT * FROM `bucket` WHERE META().id LIKE 'TD:"+userid+":%'")
rows, err := bucket.ExecuteN1qlQuery(query, nil)
我在这里做了什么明显错误的事情吗?
虽然非参数化选项有效,但我想使用参数化选项并将其标记为带有 query.AdHoc(false) 的准备好的语句
请您参考如下方法:
gocb.NewN1qlQuery("SELECT * FROM `bucket` WHERE META().id LIKE 'TD:$1:%'")
在上面的代码中,您的查询参数包含在引号内。字符串内的查询参数不会被替换。所以它正在寻找文档 id“TD:$1:”
你应该试试这个
gocb.NewN1qlQuery("SELECT * FROM `bucket` WHERE META().id LIKE 'TD:' || $1 || ':%' ")
或者
gocb.NewN1qlQuery("SELECT * FROM `bucket` WHERE META().id LIKE $1")
Pass $1 'TD:'+userid+':%'
或者
gocb.NewN1qlQuery("SELECT * FROM `bucket` WHERE META().id LIKE 'TD:"+userid+":%'")