VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

执行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;")