执行SQL语句并处理结果
向数据库发出执行SQL的请求时,需要使用Query实例发出查询,服务端执行完成后将返回一个rows实例,该实例包括查询的结果。
执行查询
使用Query执行查询:
rows, err := db.Query(“select * from products”)
if err != nil {
Fmt.Println(“Some amazing wrong happens in the process of query”, err)
Return err
}
Products := make([]producy, 0)
Defer rows.Close()
读取结果
获取单一结果
若希望获取单一结果,则进行查询的接口有所不同,并通过连接对象的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方法并传入参数,得到最终结果,此执行计划可以多次复用,传入不同参数即可。
执行更新
要更改数据(执行一个insert,update或者delete),可以使用Prepare加Exec的方法,最终返回的是:
对于Update、insert、Delete语句执行成功是返回值为该命令所影响的行数,如果影响的行数是0,则返回值就是0;
对于所有其他类型的语句,返回值为-1;
如果发生回滚,返回值也为-1;
删除
stmt, err := db.Prepare(`Delete FROM products where name = $1`)
if err != nil {
fmt.Println("Some amazing wrong happens in preparation for the deletion.")
return err
}
res, err := stmt.Exec(pname)
if err != nil {
fmt.Println("Some amazing wrong happens in execution for the deletion.")
return err
}
num, err := res.RowsAffected()
if err != nil {
fmt.Println("Some amazing wrong happens in the affected fo deletion.")
return err
}
fmt.Println("Successfully delete", num)
更新
stmt, err := db.Prepare("Update products set price = $2 where product_no = $1")
if err != nil {
fmt.Println("Some amazing wrong happens in preparation for the update.")
return err
}
defer stmt.Close()
res, err := stmt.Exec(pno, newValue)
if err != nil {
fmt.Println("Some amazing wrong happens in execution for the update.")
return err
}
num, err := res.RowsAffected()
if err != nil {
fmt.Println("Some amazing wrong happens in the affected fo update.")
return err
}
fmt.Println("Successfully update ", num)
插入
stmt, err := db.Prepare("Insert into products(Product_No,Name,Price) values($1,$2,$3)")
if err != nil {
fmt.Println("Some amazing wrong happens in preparation for the insert.")
return err
}
defer stmt.Close()
res, err := stmt.Exec(project.ProductNo, project.Name, project.Price)
if err != nil {
fmt.Println("Some amazing wrong happens in the process of doInsertOne.")
return err
}
num, err := res.RowsAffected()
if err != nil {
fmt.Println("Some amazing wrong happens in the affected fo deletion.")
return err
}
fmt.Println("Successfully add ", num)
创建或修改数据库对象
要创建、更改或者删除一个类似表或者视图这样的数据库对象, 仍然可以使用 Query() 方法,但是没有结果集返回.
例如DROP表:
_, err := db.Query("DROP TABLE mytable;")
DROP数据库:
_, err := db.Query("DROP DATABASE mydatabase;")