You need to enable JavaScript to run this app.
导航
MySQL Go Driver
最近更新时间:2024.08.01 20:24:07首次发布时间:2024.08.01 20:24:07

本文介绍如何在 Go 开发环境连接并访问 ByteHouse 云数仓。
ByteHouse 兼容开源 MySQL Go Driver 程序:go-sql-driver/mysql( 本文已在程序 1.8.1 版本下验证)

前提条件

  1. 安装 Golang 开发环境,Go 程序 1.20 或更高版本。
  2. 访问 ByteHouse 所需的连接信息,请参考 获取连接信息 获取。

连接示例

本章节介绍通过 go-sql-driver 程序连接 ByteHouse 的基本用法,您可以在 程序Github 主页 获取最新的文档和发布版本信息。

程序安装

go get -u github.com/go-sql-driver/mysql

--以下为依赖程序
go get -u github.com/stretchr/testify

安装完成后,在 go 程序代码的 import 中插入以下内容。

import (
        "database/sql"

        _ "github.com/go-sql-driver/mysql"
)

ByteHouse 连接信息

可参考下面代码样例填写ByteHouse连接信息,注意根据前提条件中获取的信息填写其中的{HOST}{API_KEY} 等字段。

// 数据库连接信息
    host := "{HOST}" // host地址
    port := 3306
    user := "bytehouse"
    password := "{API_KEY}" // 前置工作中获取得的 api key
    database := "{DATABASE_NAME}" // 连接数据库名称

基本用法示例

import (
        "database/sql"

        _ "github.com/go-sql-driver/mysql"
)

func TestMySQLConnection(t *testing.T) {

    // 数据库连接信息
    host := "{HOST}" // host地址
    port := 3306
    user := "bytehouse"
    password := "{API_KEY}" // 前置工作中获取得的 api key
    database := "{DATABASE_NAME}" // 连接数据库名称

    // 创建数据库连接
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?allowCleartextPasswords=1", user, password, host, port, database)
    db, err := sql.Open("mysql", dsn)
    if err != nil {
       log.Fatal(err)
    }
    defer db.Close()

    // 验证连接是否正常
    err = db.Ping()
    assert.Nil(t, err, "Failed to connect to database")

    // 简单查询
    query := "show tables;"
    rows, err := db.Query(query)
    assert.Nil(t, err, "Query execution failed")
    defer rows.Close()

    // 获取列名,并打印
    columns, err := rows.Columns()
    fmt.Println(strings.Join(columns, ","))

    // 获取查询结果,并打印
    for rows.Next() {
       values := make([]sql.RawBytes, len(columns))
       dest := make([]interface{}, len(columns))
       for i := range columns {
          dest[i] = &values[i]
       }

       // 将结果保存到values中
       if err := rows.Scan(dest...); err != nil {
          log.Fatal(err)
       }

       // 将values转成string数组
       record := make([]string, len(columns))
       for i, value := range values {
          if value != nil {
             record[i] = string(value)
          } else {
             record[i] = "NULL"
          }
       }

       // 打印行的结果
       fmt.Println(strings.Join(record, ","))
    }

    assert.Nil(t, rows.Err(), "Rows iteration error")
}