表格存储提供了Go语言驱动用于使用SQL访问表格存储数据。本文介绍如何使用Go语言驱动连接表格存储。
注意事项
目前支持使用SQL查询功能的地域有华东1(杭州)、华东2(上海)、华北2(北京)、华北3(张家口)、华北5(呼和浩特)、华北6(乌兰察布)、华南1(深圳)、西南1(成都)、中国香港、新加坡、印度尼西亚(雅加达)、德国(法兰克福)、沙特(利雅得)和美国(弗吉尼亚)。
前提条件
如果要使用RAM用户进行操作,请确保已创建RAM用户,并为RAM用户授予所有SQL操作权限,即在自定义权限策略中配置
"Action": "ots:SQL*"
。具体操作,请参见通过RAM Policy为RAM用户授权。已获取AccessKey(包括AccessKey ID和AccessKey Secret)。具体操作,请参见创建AccessKey。
使用流程
步骤一:安装Go语言驱动
进入项目目录后,执行以下命令安装Go语言驱动。
go get github.com/aliyun/aliyun-tablestore-go-sql-driver
步骤二:使用Go语言驱动直连
表格存储的Go语言驱动是database/sql/driver
接口的实现,导入包后即可使用database/sql
访问表格存储。
参数说明
使用Go语言驱动访问表格存储时,需要设置Go语言驱动名称和表格存储DSN(数据源名称)。具体参数说明请参见下表。
参数
示例
说明
driverName
ots
表格存储的Go语言驱动名称。固定取值为ots。
dataSourceName
https://************************:********************************@myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance
表格存储数据源名称。格式为
schema://accessKeyId:accessKeySecret@endpoint/instanceName[?param1=value1&...¶mN=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创建一个Stmt进行查询。
获取查询结果时,接收字段数据的变量类型必须和表格存储中字段数据类型相匹配。关于数据类型映射的更多信息,请参见数据类型映射。
使用Query方法查询
// 设置SQL语句,此处以查询test_table表中pk1列、col1列和col2列的数据为例介绍,请根据实际需要设置。
rows, err := db.Query("SELECT pk1, col1, col2 FROM test_table WHERE pk1 = ?", 3)
if err != nil {
panic(err) // 处理错误。
}
for rows.Next() {
var pk1 int64
var col1 float64
var col2 string
err := rows.Scan(&pk1, &col1, &col2)
if err != nil {
panic(err) // 处理错误。
}
}
使用Prepare创建一个Stmt查询
// 设置SQL语句,此处以查询test_table表中pk1列、col1列和col2列的数据为例介绍,请根据实际需要设置。
stmt, err := db.Prepare("SELECT pk1, col1, col2 FROM test_table WHERE pk1 = ?")
if err != nil {
panic(err) // 处理错误。
}
rows, err := stmt.Query(3)
if err != nil {
panic(err) // 处理错误。
}
for rows.Next() {
var pk1 int64
var col1 float64
var col2 string
err := rows.Scan(&pk1, &col1, &col2)
if err != nil {
panic(err) // 处理错误。
}
}
完整示例
以下示例用于查询华东1(杭州)地域下myinstance实例中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)
}
rows, err := db.Query("SELECT * FROM test_table")
if err != nil {
panic(err)
}
for rows.Next() {
// 获取所有列。
columns, err := rows.Columns()
if err != nil {
panic(err)
}
// 创建存放数据的数组和指针。
values := make([]interface{}, len(columns))
pointers := make([]interface{}, len(columns))
for i := range values {
pointers[i] = &values[i]
}
// 扫描数据行。
err = rows.Scan(pointers...)
if err != nil {
panic(err)
}
fmt.Println(values...)
}
rows.Close()
db.Close()
}
配置项
通过表格存储Go语言驱动支持修改Go SDK的配置项。常用配置项的详细说明请参见下表。
配置项 | 示例值 | 说明 |
retryTimes | 10 | 重试次数。默认值为10。 |
connectionTimeout | 15 | 建立连接的超时时间。默认值为15。单位为秒。0表示无限等待。 |
requestTimeout | 30 | 发送请求的超时时间。默认值为30。单位为秒。 |
maxRetryTime | 5 | 最大触发重试时间。默认值为5。单位为秒。 |
maxIdleConnections | 2000 | 最大空闲连接数。默认值为2000。 |
数据类型映射
表格存储和Go语言中字段数据类型的对应关系请参见下表。如果字段数据类型不匹配,则会产生错误。
表格存储中字段数据类型 | Go语言中字段数据类型 |
Integer | int64 |
Binary | []byte |
String | string |
Double | float64 |
Boolean | bool |
相关文档
您还可以通过控制台、命令行工具、表格存储SDK、JDBC等方式访问表格存储。具体操作,请参见通过控制台使用SQL查询、通过命令行工具使用SQL查询、通过SDK使用SQL查询、JDBC连接表格存储、通过Hibernate使用SQL查询数据和通过MyBatis使用SQL查询数据。
您还可以将Tablestore实例接入到DataWorks或DMS,然后使用SQL查询与分析Tablestore数据。更多信息,请参见接入到DataWorks和接入到DMS。
您还可以通过MaxCompute、Spark、Hive或者HadoopMR、函数计算、Flink、PrestoDB等计算引擎实现表中数据的计算与分析。具体操作,请参见计算与分析。
如果要以图表等形式可视化展示数据,您可以通过对接Grafana实现。更多信息,请参见对接Grafana。