Golang接口

  • Golang使用UXDB数据库,需要使用uxdb-golang模块来连接,Linux平台也可以使用该模块进行连接。
  1. 安装Golang

    官网下载安装Golang:https://golang.google.cn/ Golang版本要求:Go >=1.10

    官网提供多种平台的安装包,根据实际情况进行下载。

    • windows

      a. 下载对应Windows环境的安装包,后缀名为.msi。

      b. 双击运行,直接进行下一步,注意GOROOT为GO语言的主目录,GOPATH为工作目录。

      c. 默认安装go语言完成后,会自动添加环境变量,若自主修改了GOROOT与GOPATH目录路径,则需要修改环境变量。

      d. 完成后可在CMD命令行运行go version来查看版本号信息。

    • Linux

      a. 下载对应Linux环境的安装包,后缀名为.tar.gz。

      b. 执行tar命令解压安装包至/usr/local目录下(官方推荐目录)。

      c. 添加/usr/local/go/bin目录到path变量中,在/etc/profile文件最后一行添加:

      export GOROOT=/usr/local/go
      export PATH=$PATH:$GOROOT/bin
      

      保存后,执行如下命令:

      source /etc/profile
      

      d. 安装完成之后执行go version,如果出现版本号信息,则Go环境安装成功。

  2. 创建环境并连接数据库

    a. 在GOPATH工作目录下创建工程文件夹。如:GOPATH目录为E:\go,在E:\go目录下创建一个工程文件夹,如:uxdb_test

    b. 在工程文件夹uxdb_test下创建test.go文件,内容如下:

    连接UXDB oracle模式数据库,数据库名(dbname)和用户(user)需要大写。

    package main
    import (
      "database/sql"
      "fmt"
      _ "uxdb-golang" //_操作其实只是引入该包。当导入一个包时,它所有的init()函数就会被执行,但有些时候并非真的需要使用这些包,仅仅是希望它的init()函数被执行而已。这个时候就可以使用_操作引用该包
    )
    var db *sql.DB
    var err error                       //定义全局变量
    func sqlOpen() {
      db, err = sql.Open("uxdb", "host=192.168.168.128 port=5432 user=uxdb password=123456 dbname=uxdb sslmode=disable")
      //driverName是数据库驱动类型名称,uxdb的go语言驱动名称为uxdb;
      //port是数据库的端口号,默认是5432;
      //user是数据库的登录帐号;
      //dbname是数据库名称;
      //sslmode是安全验证模式,disable为不使用ssl加密方式连接;
      if err != nil {
          fmt.Println("连接数据库错误:" + err.Error())
      } else {
          fmt.Println("数据库连接成功")
      }
      err = db.Ping() //Ping检查与数据库的连接是否有效,如果失效返回error信息
      if err != nil {
          fmt.Println("DBPing错误:" + err.Error())
      } else
      {
          fmt.Println("DBPingSuccess")
      }
    }
    func sqlcreate() {
      fmt.Println("*****开始创建表*****")
      createsql := "create table Student(Sno int,Sname char(10),Sage int,Ssex char(10));"
      stmt, err := db.Prepare(createsql)
      if err != nil {
          fmt.Print(err.Error())
      } else {
          fmt.Println("create table successfully")
      }
      stmt.Exec()
    }
    
    func sqlInsert() {
      //插入数据
      fmt.Println("+++++开始进行数据库插入+++++")
      stmt, err := db.Prepare("INSERT INTO student(sno,sname,sage,ssex) VALUES($1,$2,$3,$4) ")
      checkErr(err)
      res, err := stmt.Exec("1", "mary", "22", "女")
      checkErr(err)
      affect, err := res.RowsAffected()  //RowsAffected返回被update、insert或delete命令影响的行数
      checkErr(err)
      fmt.Println("受影响的行:", affect)
    }
    
    func sqlInsert1() {
      //插入数据
      fmt.Println("+++++开始进行数据库插入+++++")
      stmt, err := db.Prepare("INSERT INTO student(sno,sname,sage,ssex) VALUES($1,$2,$3,$4) ")
      checkErr(err)
      res, err := stmt.Exec("2", "jack", "23", "男")
      checkErr(err)
      affect, err := res.RowsAffected()  //RowsAffected返回被update、insert或delete命令影响的行数
      checkErr(err)
      fmt.Println("受影响的行:", affect)
    }
    func sqlDelete() {
      //删除数据
      fmt.Println("=====开始删除数据=====")
      stmt, err := db.Prepare("delete from student where sno=$1")
      checkErr(err)
      res, err := stmt.Exec(1)
      checkErr(err)
      affect, err := res.RowsAffected()
      checkErr(err)
      fmt.Println("受影响的行:", affect)
    }
    func sqlSelect() {
      //查询数据
      fmt.Println("*****开始进行数据库查询*****")
      rows, err := db.Query("SELECT * FROM student")
      checkErr(err)
      for rows.Next() {
          var sno int
          var sname string
          var sage int
          var ssex string
          err = rows.Scan(&sno, &sname, &sage, &ssex)
          checkErr(err)
          fmt.Println("sno = ", sno, "\nsname = ", sname, "\nsage = ", sage, "\nssex = ", ssex, "\n-----------")
      }
    }
    func sqlUpdate() {
      //更新数据
      fmt.Println("#####开始进行数据更新#####")
      stmt, err := db.Prepare("update student set sname=$1 where sno=$2")
      checkErr(err)
      res, err := stmt.Exec("uxsino", 1)
      checkErr(err)
      affect, err := res.RowsAffected()
      checkErr(err)
      fmt.Println("受影响的行:", affect)
    }
    func sqlClose() {
      //关闭数据库
      db.Close()
    }
    func checkErr(err error) {
      //定义异常排查函数
      if err != nil {
          panic(err)
      }
    }
    func sqlTest() {
      //创建测试函数,调用增删改查函数进行数据库操作
      sep := "----------\n"
    
      sqlInsert()
      sqlInsert1()
      sqlSelect()
    
      sqlUpdate()
      sqlSelect()
    
      sqlDelete()
      sqlSelect()
    
      sqlClose()
      println(sep, "数据库已关闭")
    }
    func main() {
      //运行打开数据库函数
      sqlOpen()
      //运行创建表函数
      sqlcreate()
      //运行增删改查测试函数
      sqlTest()
    }
    

    c. 将GO语言数据库驱动uxdb-golang分别放在test.go的同级目录和GOROOT的src目录下。

    GOROOT目录:windows一般在C:\Go\src目录下;Linux一般在/usr/local/go/src目录下。根据实际安装golang时的环境变量而定。

    d. 运行结果

    • Windows:打开cmd窗口,进入test.go所在的目录,执行命令go run test.go运行。

    • Linux:打开终端,进入test.go所在的目录,执行命令go run test.go运行。

      E:\go\uxdb_test>go run test.go
      数据库连接成功
      DB Ping Success
      
      ***** 开始创建表 *****
      create table successfully
      
      +++++ 开始进行数据库插入 +++++
      受影响的行:1
      
      +++++ 开始进行数据库插入 +++++
      受影响的行:1
      
      ***** 开始进行数据库查询 *****
      sno: 1
      sname: mary
      sage: 22
      ssex: 女
      
      sno: 2
      sname: jack
      sage: 23
      ssex: 男
      
      ##### 开始进行数据更新 #####
      
      受影响的行:1
      
      ***** 开始进行数据库查询 *****
      sno: 2
      sname: jack
      sage: 23
      ssex: 男
      
      sno: 1
      sname: uxsino
      sage: 22
      ssex: 女
      
      ==== 开始删除数据 ====
      受影响的行:1
      
      ***** 开始进行数据库查询 *****
      sno: 2
      sname: jack
      sage: 23
      ssex: 男
      
      数据库已关闭