Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


示例

该章节展示虚谷 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)
    }

}