You need to enable JavaScript to run this app.
导航
MySQL GO Driver
最近更新时间:2025.06.25 15:55:51首次发布时间: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 所需的连接信息,请参考 获取连接信息 获取。

安装依赖程序

您可以在 程序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 连接信息

使用 IAM 用户连接

可参考下面代码样例填写 ByteHouse 连接信息,注意根据前提条件中获取的信息填写其中的 host、password、database 等字段的值。

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

参数

配置要点

host

配置为 ByteHouse 的网络域名,您可以在 ByteHouse 控制台的 租户管理>基本信息>网络信息 中查看对应信息。详情请参见步骤二:配置网络信息

port

配置为固定值 3306。

user & password

  • user:固定配置为 bytehouse。
  • password:为 ByteHouse 的 <API_Key>,您可以在 ByteHouse 控制台的 租户管理>连接信息 中获取API Key。详情请参见获取 API Key

database

配置为连接 ByteHouse 的数据库名称。

使用数据库用户连接

可参考下面代码样例填写 ByteHouse 连接信息,注意根据前提条件中获取的信息填写其中的 host、user、password 等字段的值。

// 数据库连接信息
    host := "{HOST}"
    port := 3306
    user := "{accountID_or_accountName}::{username}[::{envID}]"
    password := "{PASSWORD}" 
    database := "{DATABASE_NAME}" // 连接数据库名称

参数

配置要点

host

配置为 ByteHouse 的网络域名,您可以在 ByteHouse 控制台的 租户管理>基本信息>网络信息 中查看对应信息。详情请参见步骤二:配置网络信息

port

配置为固定值 3306。

user & password

  • user 配置为 {accountID_or_accountName}::{username}[::{envID}],详情请参见步骤三:获取 ByteHouse 连接串信息
    • {accountID_or_accountName} :指火山引擎用户账号 ID 或名称,可登录 ByteHouse 控制台,单击右上角个人中心查看并复制账号 ID 或名称。
    • {username} :指登录 ByteHouse 数据库的用户名。登录 ByteHouse 数据库账号用户名。可在 ByteHouse 控制台>权限管理>用户>查看数据库用户名
    • envID:可选,指数据库所在的环境名称。如果使用 default 环境,可不配置,如需使用其他环境,需指定环境名称。您可登录 ByteHouse 控制台,在租户管理>基本信息>**当前环境 **中获取。
  • password:可联系管理员获取数据库账号的密码。如果密码丢失或遗忘,可通联系管理员重置密码,详情请参考重置密码

database

配置为连接 ByteHouse 的数据库名称。

基本用法示例
import (
        "database/sql"

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

func TestMySQLConnection(t *testing.T) {

    // 数据库连接信息
    host := "{HOST}" // host地址
    port := 3306
    user := "bytehouse"
    password := "{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")
}