读取结果
获取单一结果
若希望获取单一结果,则进行查询的接口有所不同,并通过连接对象的Scan方法获取结果值,Scan是通过参数来返回结果值的,参数是指针类型。
示例
var date string
Err = db.QueryRow(“select current_date”).Scan(&date)
if err != nil {
Log.Fatal(err)
}
使用数组获取结果
驱动程序获取某个查询的结果集,客户端可通过数组来存储数据,同样是通过Scan来获取,一次获取一条数据。
示例
用于一条记录结果的结构:
type product struct {
ProductNo string
Name string
Price float64
}
逐条获取数据并存入数组:
rows, err := db.Query(`Select * from products`)
if err != nil {
fmt.Println("Some amazing wrong happens in the process of Query.", err)
return err, []product{}
}
products := make([]product, 0)
defer rows.Close() //关闭连接
index := 0
var p product
for rows.Next() {
err := rows.Scan(&p.ProductNo, &p.Name, &p.Price)
products = append(products, p)
if err != nil { // 获得的都是字符串
fmt.Println("Some amazing wrong happens in the process of queryAll.", err)
return err, products
}
index++
}
使用注意事项:在获取到rows结果集后,建立及时声明 defer rows.Close() ,避免忘记释放空间导致后续空间紧张。
支持PBE
本驱动支持vastbase的缓存计划以及参数绑定,其中缓存计划以及后期的绑定参数执行接口分别为:prepare,Query。
缓存计划示例
sqlStr := "Select * from products where name=$1"
stmt, err := db.Prepare(sqlStr)
if err != nil {
fmt.Printf("prepare failed, err:%v\n", err)
return err, []product{}
}
defer stmt.Close()
此时返回的是一个stmt对象,并非结果,该对象必须绑定参数才能执行出结果。
传入参数执行计划示例:
rows, err := stmt.Query(pname)
if err != nil {
fmt.Printf("query failed, err:%v\n", err)
return err, []product{}
}
defer rows.Close()
调用stmt对象的Query方法并传入参数,得到最终结果,此执行计划可以多次复用,传入不同参数即可。