示例
该章节展示虚谷 Go 驱动简易使用方法,详细 Demo 项目,部署在gitee仓库。
DDL 语句执行
go
package main
import (
_ "gitee.com/XuguDB/go-xugu-driver"
"database/sql"
"log"
)
func main() {
db, _ := sql.Open("xugu", "IP=127.0.0.1;DB=SYSTEM;User=SYSDBA;PWD=SYSDBA;Port=5138;CHAR_SET=UTF8")
// 通过Exec 执行DDL语句
_, err = db.Exec("create table go_1th_test(c1 int, c2 varchar, c3 float);")
if err != nil {
log.Fatal(err)
}
_, err = db.Exec("create table go_2th_test(c1 int, c2 blob, c3 clob);")
if err != nil {
log.Fatal(err)
}
_, err = db.Exec("create table go_3th_test(c1 int, c2 datetime);")
if err != nil {
log.Fatal(err)
}
err = db.Close()
if err != nil {
log.Fatal(err)
}
}
DML 语句执行
go
package main
import (
_ "gitee.com/XuguDB/go-xugu-driver"
"database/sql"
"log"
)
var Ques = []string{
"insert into go_1th_test values(1, 'AJX', 0.99);",
"insert into go_1th_test values(1, 'BJX', 0.99);",
"insert into go_1th_test values(1, 'CJX', 0.99);",
"update go_1th_test set c1=1 where c1=1;",
}
func main() {
db, _ := sql.Open("xugu", "IP=127.0.0.1;DB=SYSTEM;User=SYSDBA;PWD=SYSDBA;Port=5138;CHAR_SET=UTF8")
for _, sql := range Ques {
// 通过Exec 执行DML语句
res, err := db.Exec(sql)
if err != nil {
log.Fatal(err)
continue
}
fmt.Printf("%s ... ok\n", sql)
// 获取语句影响行数。
effec, _ := res.RowsAffected()
fmt.Printf("Number of rows affected: %d\n", effec)
}
err := db.Close()
if err != nil {
log.Fatal(err)
}
}
传参处理
go
package main
import (
_ "gitee.com/XuguDB/go-xugu-driver"
"database/sql"
"log"
)
func main() {
db, _ := sql.Open("xugu", "IP=127.0.0.1;DB=SYSTEM;User=SYSDBA;PWD=SYSDBA;Port=5138;CHAR_SET=UTF8")
// 传参执行语句。
res, err := db.Exec("insert into go_3th_test values(?,?);", 1, time.Now())
if err != nil {
log.Fatal(err)
}
effec, _ := res.RowsAffected()
fmt.Printf("Number of rows affected: %d\n", effec)
err = db.Close()
if err != nil {
log.Fatal(err)
}
}
事务处理
go
package main
import (
_ "gitee.com/XuguDB/go-xugu-driver"
"database/sql"
"log"
)
func main() {
db, _ := sql.Open("xugu", "IP=127.0.0.1;DB=SYSTEM;User=SYSDBA;PWD=SYSDBA;Port=5138;CHAR_SET=UTF8")
// 开启一个事务。
Tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
_, err = Tx.Exec("insert into go_1th_test values(9,'9',0.99)")
if err != nil {
log.Fatal(err)
}
// 提交或回滚当前事务。
//err = Tx.Commit()
err = Tx.Rollback()
if err != nil {
log.Fatal(err)
}
db.Close()
}
预处理语句
go
package main
import (
_ "gitee.com/XuguDB/go-xugu-driver"
"database/sql"
"log"
)
func main() {
db, _ := sql.Open("xugu", "IP=127.0.0.1;DB=SYSTEM;User=SYSDBA;PWD=SYSDBA;Port=5138;CHAR_SET=UTF8")
// 预处理语句
stmt, err := db.Prepare("insert into go_3th_test values(?,?);")
if err != nil {
log.Fatal(err)
}
pos := 1
for pos <= 10 {
_, err = stmt.Exec(pos, time.Now())
if err != nil {
log.Fatal(err)
}
pos++
}
stmt.Close()
err = db.Close()
if err != nil {
log.Fatal(err)
}
}
大对象操作
go
package main
import (
_ "gitee.com/XuguDB/go-xugu-driver"
"database/sql"
"log"
)
func main() {
db, _ := sql.Open("xugu", "IP=127.0.0.1;DB=SYSTEM;User=SYSDBA;PWD=SYSDBA;Port=5138;CHAR_SET=UTF8")
//打开大对象文件,需要事先准备文件
fp, err := os.Open("./LOB/BLOB.png")
if err != nil {
log.Fatal(err)
}
var contents []byte
contents, err = ioutil.ReadAll(fp)
if err != nil {
log.Fatal(err)
}
fp.Close()
// INSERT LARGE OBJECT DATA INTO THE DATABASE
_, err = db.Exec("insert into go_2th_test values(2,?,null);", contents)
if err != nil {
log.Fatal(err)
}
// QUERY LARGE OBJECT DATA FROM THE DATABASE
var rows *sql.Rows
rows, err = db.Query("select len(2) from go_2th_test where c1=2;")
if err != nil {
log.Fatal(err)
}
// 配置缓存区大小
dest := make([]byte, 256)
var pval interface{} = &dest
if rows.Next() {
err = rows.Scan(pval)
if err != nil {
log.Fatal(err)
}
}
rows.Close()
rows, err = db.Query("select c2 from go_2th_test where c1=2;")
if err != nil {
log.Fatal(err)
}
// 手动分配足够长的内存空间来存储大型对象数据
length, _ := strconv.Atoi(string(*(pval.(*[]byte))))
txt := make([]byte, length)
var lob interface{}
lob = &txt
if rows.Next() {
err = rows.Scan(lob)
if err != nil {
log.Fatal(err)
}
}
fp, err = os.Create("./BLOB.png")
if err != nil {
log.Fatal(err)
}
// 写入文件中
size, err := fp.WriteString(string(*(lob.(*[]byte))))
if err != nil {
log.Fatal(err)
}
fmt.Printf("Number of bytes written to file: %d\n\n", size)
fp.Close()
rows.Close()
err = db.Close()
if err != nil {
log.Fatal(err)
}
}