Go-SQL-Driver/MySQL 连接 OceanBase 数据库示例程序

本文将介绍如何使用 Go-SQL-Driver/MySQL 驱动和 OceanBase 数据库构建一个应用程序,实现创建表、插入数据和查询数据等基本操作。

image.png点击下载 go-oceanbase 示例工程

前提条件

安装 OceanBase 数据库、 Go 语言和相关驱动 ,并确保已经正确配置了环境变量。

  • 安装 OceanBase 数据库

  • 安装 Go 语言

  • 安装 Go-SQL-Driver/MySQL 驱动

操作步骤

说明

本文中给出的操作步骤是在 Windows 环境下生成的。如果您使用的是其他操作系统环境或编译器,那么操作步骤可能会略有不同。

  1. (可选)安装 Go 语言和驱动。

  2. 获取 OceanBase 数据库连接信息。

  3. 修改go-oceanbase项目中的数据库连接信息。

  4. 运行go-oceanbase项目。

步骤一:(可选)安装 Go 语言和驱动

若您已经安装了 Go 语言和 Go-SQL-Driver/MySQL 驱动,可以直接跳过此步骤。若您未安装,可根据以下步骤进行安装。

  1. 安装 Go 语言

    1. 下载 Go 语言安装包:可以从 Go 官网 下载适合自己操作系统的安装包。

      说明

      本文档使用的 Go 安装包名为 go1.20.6.windows-amd64.msi。

    2. 安装 Go 语言:双击下载的安装包,按照提示进行安装。

    3. 配置环境变量:将 Go 语言的安装路径添加到系统的 PATH 环境变量中。

      • 在 Windows 环境中,可以在 控制面板 > 系统和安全 > 系统 > 高级系统设置 > 环境变量 > 系统变量 中增加 Path 的值为C:\usr\local\go\bin

      • 在 Linux 或 macOS 环境中,可以编辑~/.bashrc~/.bash_profile文件,在其中添加以下内容:

        export PATH=$PATH:/usr/local/go/bin
      说明

      \usr\local\go\bin为默认安装目录,若在安装 Go 语言时修改了安装目录,请替换为对应的目录。

    4. 验证安装:在 Shell 命令行中输入以下命令,查看 Go 语言的版本信息,以验证安装是否成功:

      C:\Users\admin\> go version
      go version go1.20.6 windows/amd64
  2. 安装 Go-SQL-Driver/MySQL 驱动

    根据 Go 语言的不同版本,可以选择不同的安装方式,安装 Go-SQL-Driver/MySQL 驱动时需要进入到对应的项目目录下打开命令行终端。关于Go-SQL-Driver/MySQL的详细信息,您可参考 Github

    安装命令如下:

    C:\Users\admin\Desktop\go-oceanbase>go get -u github.com/go-sql-driver/mysql
    go: downloading github.com/go-sql-driver/mysql v1.7.1
    go: added github.com/go-sql-driver/mysql v1.7.1

    如果由于版本或网络的原因,无法通过go get命令安装时,可通过go install命令进行go-sql-driver/mysql安装。

    1. go/src目录克隆 github 中的go-sql-driver/mysql仓库。

      cd /usr/local/go/src   
      git clone https://github.com/go-sql-driver/mysql.git 
      重要

      /usr/local/go/src需要替换成 Go 实际安装目录操作。

    2. 通过go install进行安装。

      go install mysql
      重要

      部分版本go install的默认执行目录可能不是/src,可以通过go install执行后的报错判断实际目录。例如,报错cannot find package "mysql" in: /usr/local/go/src/vendor/mysql,则应该将 mysql 文件夹放在/src/vendor目录下再执行安装命令。

    3. 检查 Go-SQL-Driver/MySQL 驱动是否已经安装,若安装失败,请按照报错信息进行修改。

      go list -m github.com/go-sql-driver/mysql

步骤二:获取 OceanBase 数据库连接信息

联系 OceanBase 数据库部署人员或者管理员获取相应的数据库连接串。

obclient  -h{host} -u{username} -p****** -P{port} -D{schema_name}

数据库连接串包含了访问数据库所需的参数信息,可通过数据库连接串验证登录数据库,保证连接串参数信息正确。

说明

test.go文件中需要这里的 URL 信息。

参数说明:

  • hostOceanBase 数据库连接的域名。

  • user_name:提供租户的连接账户。

  • password提供账户密码。

  • port:提供 OceanBase 数据库连接端口,默认端口是 3306。

  • schema_name:需要访问的 Schema 名称。

步骤三: 修改go-oceanbase项目中的数据库连接信息

根据 步骤二:获取 OceanBase 数据库连接信息 中的信息修改test.go文件中的数据库连接信息。选中test.go文件,右键单击选择 打开方式,可通过 记事本 或其他编辑软件打开。

image.png

示例如下:

  • OBServer 节点的 IP 地址为xxx.xxx.xxx.xxx

  • 访问端口使用的是 3306。

  • 需要访问的 Schema 名称为test

  • 租户的连接账户是root

  • 密码是******

示例代码如下:

conn := "root:******@tcp(xxx.xxx.xxx.xxx:3306)/test"

步骤四:运行go-oceanbase项目

代码编辑完成后,在项目目录下打开命令行终端,通过go run直接运行 Go 文件运行如下命令运行:

C:\Users\admin\Desktop\go-oceanbase>go run test.go

(可选)在 Linux 或 macOS 环境中需要配置临时环境变量后,才能运行go run

export PATH=$PATH:/usr/local/go/bin
go run test.go

运行后返回如下内容,说明数据库连接成功,示例语句正确执行:

说明

该内容是屏蔽了 “删除表 t1” 运行后的结果。

C:\Users\admin\Desktop\go-oceanbase>go run test.go
success to connect OceanBase with go_mysql driver
Hello OceanBase

项目代码介绍

点击go-oceanbase下载项目代码。是一个名称为go-oceanbase的压缩包。

解压后,得到一个名为go-oceanbase的文件夹。目录结构如下所示:

|-- go.mod
|-- go.sum
|-- test.go

文件说明:

  • go.mod:Go 语言模块文件,用于定义项目的模块依赖关系和版本信息。

  • go.sum:Go V1.11 及以上版本中新增的模块管理文件,用于记录项目依赖的模块及其版本信息,以及对应的校验和(Checksum)。

  • test.go: Go 源代码文件,其中包含项目的示例代码。

go.mod 代码介绍

go.mod文件用于定义项目的模块名称、Go 版本号以及依赖项相关声明。

go.mod文件包含以下内容:

  • module go-oceanbase:这是项目的模块名称,它定义了项目的命名空间。在 Go 1.16 及更高版本中,模块名称必须与项目的根目录名称匹配。

  • go 1.20:这是项目所需的 Go 版本。

  • require github.com/go-sql-driver/mysql v1.7.1 // indirect:这是项目的依赖项声明。它指定了项目所需的github.com/go-sql-driver/mysql模块版本为 V1.7.1,以及该依赖项是间接依赖项,与另一个依赖项go.sum相关联。

go.sum 代码介绍

go.sum文件用于定义github.com/go-sql-driver/mysql依赖项的版本信息,以确保项目使用正确的依赖项版本。

go.sum文件包含以下内容:

  • github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=模块的源代码文件的哈希值,用于确保在构建项目时使用正确的版本。这里的哈希值为lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=

  • github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=模块的依赖项文件的哈希值,用于确保在构建项目时使用正确的依赖项版本。这里的哈希值为OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=

test.go 代码介绍

test.go文件定义了如何使用 Go 语言和 OceanBase 数据库的 MySQL 模式进行交互,包括连接数据库、创建表、插入数据、查询数据和删除表等操作。test.go文件包含以下内容:

  1. 定义main包。package main表示这是一个可执行程序的包,这个包包含了一个main()函数,这个函数会在程序运行时被执行。

  2. 定义import包。

    import语句导入了以下四个包:

    • database/sql:用于提供通用的 SQL 数据库访问接口。它定义了一组通用的接口和函数,用于连接和操作各种类型的 SQL 数据库。

    • fmt:用于提供格式化输入和输出的函数。它定义了一组函数,用于将数据格式化为字符串并输出到控制台或其他设备。

    • log:用于提供记录日志的函数。它定义了一组函数,用于将日志信息输出到控制台或其他设备。

    • github.com/go-sql-driver/mysql:用于提供 MySQL 模式的驱动程序。它实现了database/sql包中定义的接口,以便在 Go 语言中连接和操作 MySQL 模式,这里需要填写正确的go-sql-driver/mysql的安装路径。

    代码如下:

    import (
    "database/sql"
    "fmt"
    "log"
    
    _ "github.com/go-sql-driver/mysql"
    // 填写 go-sql-driver/mysql 的安装路径。
    )
  3. 定义Str结构体。 包含字段Name,用于存储查询结果;定义了一个main()函数,该函数中selectAll()函数,用于完成创建表、插入数据、查询数据和删除表等操作。

    代码如下:

    type Str struct {
    Name string
    }
    
    func main() {
    selectAll()
    }
  4. 定义selectAll()函数。

    selectAll()函数它包含了连接数据库、创建表、插入数据、查询数据和删除表等操作。

    1. 连接数据库。 定义连接字符串conn,包含了 MySQL 模式的连接参数,包括用户名、密码、IP 地址、端口号和数据库名称等信息。调用sql.Open()函数打开数据库连接,如果出错则记录日志并退出程序。使用defer关键字延迟关闭数据库连接,以确保在函数结束时关闭连接。

      代码如下:

      conn := "user_name:******@tcp(host:port)/schema_name"
      // 数据库连接参数
      
      db, err := sql.Open("mysql", conn)
      if err != nil {
          log.Fatal(err)
      }
    2. 控制台打印消息。 使用defer关键字延迟执行db.Close()函数,以确保在函数结束时关闭数据库连接。使用fmt.Printf()函数输出一条连接成功的消息到控制台。

      代码如下:

      defer db.Close()
      
      if err != nil {
          log.Fatal(err)
      }
      
      fmt.Printf("success to connect OceanBase with go_mysql driver\n")
    3. 创建数据。 创建了一个名为t1的表,设置一个字符串类型的字段str,长度为256

      代码如下:

          _, err = db.Query("create table t1(str varchar(256))")
      if err != nil {
          log.Fatal(err)
      }
    4. 插入数据。 插入一行数据到表t1中,设置该行数据的str字段的值为Hello OceanBase

      代码如下:

      _, err = db.Query("insert into t1 values ('Hello OceanBase')")
      if err != nil {
          log.Fatal(err)
      }
    5. 查询数据。 查询表t1中的所有数据,并将查询结果赋值给变量res。如果查询失败,则返回错误信息。

      代码如下:

      res, err := db.Query("SELECT * FROM t1")
      if err != nil {
          log.Fatal(err)
      }
      defer res.Close()
      
      for res.Next() {
          var str Str
          res.Scan(&str.Name)
          fmt.Printf("%s\n", str.Name)
      }
    6. 删除数据。 删除表t1。如果删除失败,则返回错误信息。

      代码如下:

      _, err = db.Query("drop table t1")
      if err != nil {
          log.Fatal(err)
      }

完整的代码展示

go.mod

module go-oceanbase
go 1.20
require github.com/go-sql-driver/mysql v1.7.1 // indirect

go.sum

github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=

test.go

package main

    import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/go-sql-driver/mysql"
    // 填写 go-sql-driver/mysql 的安装路径。
    )

    type Str struct {
    Name string
    }

    func main() {
    selectAll()
    }

    func selectAll() {
    conn := "user_name:******@tcp(host:port)/schema_name"
    // 数据库连接参数

    db, err := sql.Open("mysql", conn)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("success to connect OceanBase with go_mysql driver\n")
    // 创建表 t1
    _, err = db.Query("create table t1(str varchar(256))")
    if err != nil {
        log.Fatal(err)
    }

    // 插入数据
    _, err = db.Query("insert into t1 values ('Hello OceanBase')")
    if err != nil {
        log.Fatal(err)
    }

    // 查询数据
    res, err := db.Query("SELECT * FROM t1")
    if err != nil {
        log.Fatal(err)
    }
    defer res.Close()

    for res.Next() {
        var str Str
        res.Scan(&str.Name)
        fmt.Printf("%s\n", str.Name)
    }

    // 删除表 t1
    _, err = db.Query("drop table t1")
    if err != nil {
        log.Fatal(err)
    }
    }

相关文档

有关 Go-SQL-Driver/MySQL 的内容在 OceanBase 数据库开源社区中也有更多信息,详情请参考 Go-SQL-Driver/MySQL