通过Go语言驱动使用SQL查询

更新时间:
复制为 MD 格式

表格存储提供 Go 语言驱动(aliyun-tablestore-go-sql-driver),实现了 database/sql/driver 接口,支持通过标准 database/sql 包访问表格存储数据。

前提条件

  • 已获取 AccessKey,RAM 用户需具备"Action": "ots:SQL*"权限。

  • 已创建数据表和映射表,详见DDL 操作

使用流程

步骤一:安装Go语言驱动

执行以下命令安装 Go 语言驱动:

go get github.com/aliyun/aliyun-tablestore-go-sql-driver

步骤二:使用Go语言驱动直连

参数说明

使用 Go 语言驱动访问表格存储时,需要设置驱动名称和 DSN(数据源名称)。参数说明如下。

参数

说明

driverName

表格存储 Go 语言驱动名称,固定取值为 ots

dataSourceName

表格存储数据源名称。格式为schema://accessKeyId:accessKeySecret@endpoint/instanceName[?param1=value1&...&paramN=valueN]。主要字段说明如下:

  • schema(必选):表格存储驱动使用的协议,一般设置为 https

  • accessKeyId:accessKeySecret(必选):阿里云账号或 RAM 用户的 AccessKey ID 和 AccessKey Secret。

  • endpoint(必选):实例的服务地址。

  • instanceName(必选):实例名称。

其他常用配置项的说明详见配置项

示例

import (
    "database/sql"
    _ "github.com/aliyun/aliyun-tablestore-go-sql-driver"
)

// 设置Go语言驱动名称和表格存储数据源名称。
db, err := sql.Open("ots", "https://access_key_id:access_key_secret@endpoint/instance_name")
if err != nil {
    panic(err)    // 处理错误。
}

步骤三:查询数据

Go 语言驱动支持使用 Query 方法直接执行查询语句,也支持使用 Prepare 创建预处理语句查询。

说明

获取查询结果时,接收字段数据的变量类型必须与表格存储的字段数据类型匹配。映射关系参见数据类型映射

Query

rows, err := db.Query("SELECT pk1, col1, col2 FROM test_table WHERE pk1 = ?", 3)
if err != nil {
    panic(err)
}
defer rows.Close()
for rows.Next() {
    var pk1 int64
    var col1 float64
    var col2 string
    if err := rows.Scan(&pk1, &col1, &col2); err != nil {
        panic(err)
    }
    fmt.Println(pk1, col1, col2)
}

Prepare

stmt, err := db.Prepare("SELECT pk1, col1, col2 FROM test_table WHERE pk1 = ?")
if err != nil {
    panic(err)
}
defer stmt.Close()
rows, err := stmt.Query(3)
if err != nil {
    panic(err)
}
defer rows.Close()
for rows.Next() {
    var pk1 int64
    var col1 float64
    var col2 string
    if err := rows.Scan(&pk1, &col1, &col2); err != nil {
        panic(err)
    }
    fmt.Println(pk1, col1, col2)
}

完整示例

以下示例用于连接表格存储实例并查询 test_table 表的所有数据:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/aliyun/aliyun-tablestore-go-sql-driver"
)

func main() {
    db, err := sql.Open("ots", "https://************************:********************************@myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance")
    if err != nil {
        panic(err)
    }
    defer db.Close()

    rows, err := db.Query("SELECT * FROM test_table")
    if err != nil {
        panic(err)
    }
    defer rows.Close()

    columns, _ := rows.Columns()
    for rows.Next() {
        values := make([]interface{}, len(columns))
        pointers := make([]interface{}, len(columns))
        for i := range values {
            pointers[i] = &values[i]
        }
        if err := rows.Scan(pointers...); err != nil {
            panic(err)
        }
        fmt.Println(values...)
    }
}

配置项

通过 DSN 查询参数可修改 Go 语言驱动的配置项。

https://ak:sk@endpoint/instance?retryTimes=3&requestTimeout=10s

常用配置项说明如下。时间类配置项均使用 Go duration 格式(如 15s500ms)。

配置项

默认值

说明

retryTimes

10

最大重试次数。整数。

connectionTimeout

15s

建立连接的超时时间。0 表示无限等待。

requestTimeout

30s

发送请求的超时时间。

maxRetryTime

5s

最大触发重试时间。

maxIdleConnections

2000

最大空闲连接数。整数。

数据类型映射

表格存储与 Go 语言的字段数据类型对应关系如下。类型不匹配时会返回错误。

表格存储中字段数据类型

Go语言中字段数据类型

Integer

int64

Binary

[]byte

String

string

Double

float64

Boolean

bool