更新时间:2025-09-04 GMT+08:00
完整示例
以DSN连接串,初始化employee表后批量插入数据,并获取插入结果输出结果集列信息为例:
// main.go
package main
import (
"database/sql"
"fmt"
_ "gitee.com/opengauss/openGauss-connector-go-pq"
"log"
"os"
)
func main() {
// 创建数据库对象
hostip := os.Getenv("GOHOSTIP") // GOHOSTIP:写入环境变量的IP地址
port := os.Getenv("GOPORT") // GOPORT:写入环境变量的port
usrname := os.Getenv("GOUSRNAME") // GOUSRNAME:写入环境变量的用户名
passwd := os.Getenv("GOPASSWD") // GOPASSWD:写入环境变量的用户密码
dbname := os.Getenv("GODBNAME") // GODBNAME:写入环境变量的目标连接数据库名
connect_timeout := os.Getenv("GOCONNECT_TIMEOUT") // GOCONNECT_TIMEOUT:写入环境变量的连接数据库超时时间
socket_timeout := os.Getenv("GOSOCKET_TIMEOUT") // GOSOCKET_TIMEOUT:写入环境变量的SQL最长的执行时间
rootcertPath := os.Getenv("GOROOTCERT") // GOROOTCERT:写入环境变量的根证书路径
sslkeyPath := os.Getenv("GOSSLKEY") // GOSSLKEY:写入环境变量的客户端证书的密钥路径
sslcertPath := os.Getenv("GOSSLCERT") // GOSSLCERT:写入环境变量的客户端SSL证书路径
sslmode := os.Getenv("GOSSLMODE") // GOSSLMODE:写入环境变量的启用SSL加密的方式
dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s connect_timeout=%s socketTimeout=%s " +
"sslmode=%s sslrootcert=%s sslkey=%s sslcert=%s target_session_attrs=master",
hostip,
port,
usrname,
passwd,
dbname,
connect_timeout,
socket_timeout,
sslmode,
rootcertPath,
sslkeyPath,
sslcertPath,
)
db, err := sql.Open("gaussdb", dsn)
if err != nil {
panic(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
panic(err)
}
fmt.Println("connect success.")
// 开启事务
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
return
}
// 初始化数据表
_, err = tx.Exec("drop table if exists employee;")
if err != nil {
fmt.Println("drop table employee failed, err:", err)
err = tx.Rollback() // 出错则回滚事务
return
}
fmt.Println("drop table employee success.")
_, err = tx.Exec("create table employee (id SERIAL PRIMARY KEY, name varchar(20), age int, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);")
if err != nil {
fmt.Println("create table employee failed, err:", err)
err = tx.Rollback()
return
}
fmt.Println("create table employee success.")
// 批量插入数据
employee := []struct {
Name string
Age uint8
}{{Name: "zhangsan", Age: 21}, {Name: "lisi", Age: 22}, {Name: "zhaowu", Age: 23}}
batchSql := "INSERT INTO employee (name, age) VALUES "
vals := []interface{}{}
placeholders := "(?, ?)"
for _, u := range employee {
vals = append(vals, u.Name, u.Age)
}
stmt := batchSql + placeholders
_, err = tx.Exec(stmt, vals...)
if err != nil {
fmt.Println("batch insert into table employee failed, err:", err)
err = tx.Rollback()
return
}
fmt.Println("batch insert into table employee success.")
// 提交事务
err = tx.Commit()
if err != nil {
fmt.Println("commit failed, err:", err)
err = tx.Rollback()
log.Fatal(err)
return
}
fmt.Println("commit success.")
// 获取结果集列信息
rows, err := db.Query("SELECT id, name, created_at FROM employee;")
if err != nil {
fmt.Println("query table employee failed, err:", err)
return
}
columns, err := rows.Columns()
if err != nil {
fmt.Println("get query rows columns failed, err:", err)
return
}
fmt.Println("列数:", len(columns))
fmt.Println("列名list:", columns)
fmt.Println("--------------------------")
// 获取列的类型信息
columnTypes, err := rows.ColumnTypes()
if err != nil {
fmt.Println("get query rows ColumnTypes failed, err:", err)
return
}
for _, ct := range columnTypes {
fmt.Println("列名:", ct.Name())
fmt.Println("数据库类型:", ct.DatabaseTypeName())
length, ok := ct.Length()
if ok {
fmt.Println("长度:", length)
}
precision, scale, ok := ct.DecimalSize()
if ok {
fmt.Printf("精度/小数位数:%d/%d\n", precision, scale)
}
nullable, ok := ct.Nullable()
if ok {
fmt.Println("是否可为空:", nullable)
}
fmt.Println("Go 类型:", ct.ScanType())
fmt.Println("-----")
}
}
结果验证
以下为完整示例的执行结果:
connect success. drop table employee success. create table employee success. batch insert into table employee success. commit success. 列数: 3 列名list: [id name created_at] -------------------------- 列名: id 数据库类型: INT4 Go 类型: int32 ----- 列名: name 数据库类型: VARCHAR 长度: 20 Go 类型: string ----- 列名: created_at 数据库类型: TIMESTAMP Go 类型: time.Time -----
预期结果包含以下内容:
- 拼接数据库连接串,通过sql.Open创建连接对象,并通过db.Ping()方法检测是否成功连接数据库。
- 开启事务,并在事务中初始化测试表employee。
- 在事务中构造employee测试数据,并生成批量插入SQL,通过事务对象提供的接口Exec,绑参并发送报文到数据库执行SQL。
- 批量插入执行成功后,通过Commit接口提交事务。(如果执行失败通过Rollback接口回滚事务)。
- 通过数据连接对象"db"提供的Query接口查询批量插入执行结果,并通过结果对象"rows"提供的Columns接口获取所有列名列表以及结果对象"rows"提供的ColumnTypes接口获取结果集列的元数据信息。
回退方法
通过事务对象的Rollback接口,对事务内的操作进行回滚。
父主题: 操作步骤