本文介紹如何使用Go語言驅動串連Tablestore。

注意事項

目前支援使用SQL查詢功能的地區有華東1(杭州)、華東2(上海)、華北2(北京)、華北3(張家口)、華南1(深圳)和新加坡。

前提條件

  • 如果要使用RAM使用者進行操作,請確保已建立RAM使用者,並為RAM使用者授予所有SQL操作許可權,即在自訂權限原則中配置"Action": "ots:SQL*"。具體操作,請參見配置RAM使用者權限
  • 已擷取AccessKey(包括AccessKey ID和AccessKey Secret)。具體操作,請參見擷取AccessKey
  • 已建立資料表並為資料表建立映射關係。具體操作,請分別參見建立資料表建立表的映射關係

步驟一:安裝Go語言驅動

通過以下命令安裝Go語言驅動。
go get github.com/aliyun/aliyun-tablestore-go-sql-driver

步驟二:使用Go語言驅動直連

Tablestore的Go語言驅動是database/sql/driver介面的實現,匯入包後即可使用database/sql訪問Tablestore。

  • 參數說明

    使用Go語言驅動訪問Tablestore時,需要設定Go語言驅動名稱和Tablestore DSN(資料來源名稱)。具體參數說明請參見下表。

    參數 樣本 說明
    driverName ots Tablestore的Go語言驅動名稱。固定取值為ots。
    dataSourceName https://************************:********************************@myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance Tablestore資料來源名稱。格式為schema://accessKeyId:accessKeySecret@endpoint/instanceName[?param1=value1&...&paramN=valueN]。主要欄位說明如下:
    • schema(必選):Tablestore驅動使用的協議,一般設定為https。
    • accessKeyId:accessKeySecret(必選):阿里雲帳號或者RAM使用者的AccessKey ID和AccessKey Secret。
    • endpoint(必選):執行個體的服務地址。更多資訊,請參見服務地址
    • instanceName(必選):執行個體名稱。

    其他常用配置項的說明,請參見配置項

  • 樣本
    import (
        "database/sql"
        _ "github.com/aliyun/aliyun-tablestore-go-sql-driver"
    )
    
    // 設定Go語言驅動名稱和Tablestore資料來源名稱。
    db, err := sql.Open("ots", "https://access_key_id:access_key_secret@endpoint/instance_name")
    if err != nil {
        panic(err)    // 處理錯誤。
    }

步驟三:查詢資料

Tablestore的Go語言驅動支援直接使用Query方法執行查詢語句,也支援使用Prepare建立一個Stmt進行查詢。

注意 擷取查詢結果時,接收欄位資料的變數類型必須和Tablestore中欄位資料類型相匹配。關於資料類型映射的更多資訊,請參見資料類型映射
  • 使用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"
)

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()
}

配置項

通過Tablestore Go語言驅動支援修改Go SDK的配置項。常用配置項的詳細說明請參見下表。
配置項 樣本值 說明
retryTimes 10 重試次數。預設值為10。
connectionTimeout 15 建立串連的逾時時間。預設值為15。單位為秒。0表示無限等待。
requestTimeout 30 發送請求的逾時時間。預設值為30。單位為秒。
maxRetryTime 5 最大觸發重試時間。預設值為5。單位為秒。
maxIdleConnections 2000 最大空閑串連數。預設值為2000。

資料類型映射

Tablestore和Go語言中欄位資料類型的對應關係請參見下表。如果欄位資料類型不匹配,則會產生錯誤。
Tablestore中欄位資料類型 Go語言中欄位資料類型
Integer int64
Binary []byte
String string
Double float64
Boolean bool