表格存储 Go SDK 开发入门

准备工作

在您开始Tablestore SDK开发前,需确保已开通表格存储服务并且已创建表格存储实例。

您需要提前获取到以下几个参数


开发简介

开发示例中将以订单场景为例,使用Tablestore SDK实现如下几个功能。

  • 订单表创建。
  • 订单插入。
  • 订单号查询。
  • 订单搜索。


字段名

字段类型

字段描述

order_id

String

主键

订单号

customer_name

String

属性列

消费者姓名

product_name

String

属性列

产品名

product_type

String

属性列

产品类型

order_time

String

属性列

下单时间

pay_time

String

属性列

支付时间

订单表

开发步骤

初始化连接

Tablestore支持Http/Https协议访问服务端,使用Go SDK发起请求前,您需要初始化一个OTSClinet实例,初始化需要获取到服务地址(endpoint)、实例名(instanceName)、密钥(accessKeyId、accessSecret)等信息。代码如下

func main() {
 client := tablestore.NewClient("https://order-instance.cn-beijing.ots.aliyuncs.com",//your endpoint,此处可选择公网地址
    "order-instance",//your instance name
    "",//your accessKeyId
    "")//your accessSecret
 createOrderTable(client)
}

创建数据表

示例代码中创建了一张订单数据表order。

func createOrderTable(client *tablestore.TableStoreClient)  {
     createtableRequest := new(tablestore.CreateTableRequest)
     tableMeta := new(tablestore.TableMeta)
     tableMeta.TableName = "order1"//设置表名
     tableMeta.AddPrimaryKeyColumn("order_id", tablestore.PrimaryKeyType_STRING)//设置主键
     tableOption := new(tablestore.TableOption)
     tableOption.TimeToAlive = -1
     tableOption.MaxVersion = 1
     reservedThroughput := new(tablestore.ReservedThroughput)
     reservedThroughput.Readcap = 0
     reservedThroughput.Writecap = 0
     createtableRequest.TableMeta = tableMeta
     createtableRequest.TableOption = tableOption
     createtableRequest.ReservedThroughput = reservedThroughput
     client.CreateTable(createtableRequest)//发送创建数据表请求
     fmt.Println("create table succeed")
}

写入数据

示例代码中写入了一条订单数据,订单号order_id为“o1”。样例中模拟了一万条订单数据,这里不作展示。

func putOrder(client *tablestore.TableStoreClient)  {
     putRowRequest := new(tablestore.PutRowRequest)
     putRowChange := new(tablestore.PutRowChange)
     putRowChange.TableName = "order1"//设置表名
     putPk := new(tablestore.PrimaryKey)
     //添加主键值。主键顺序与数据类型需与表结构保持一致。
     putPk.AddPrimaryKeyColumn("order_id", "o1")
     putRowChange.PrimaryKey = putPk
     //添加属性列
     putRowChange.AddColumn("customer_name", "消十一")
     putRowChange.AddColumn("product_name", "iphone 6")
     putRowChange.AddColumn("product_type", "手机")
     putRowChange.AddColumn("order_time", "2021-10-25 09:20:01")
     putRowChange.AddColumn("pay_time", "2017-10-25 10:00:01")
     //更新前置条件,默认可以设置为RowExistenceExpectation_IGNORE
     putRowChange.SetCondition(tablestore.RowExistenceExpectation_IGNORE)
     putRowChange.ReturnType = tablestore.ReturnType_RT_PK
     putRowRequest.PutRowChange = putRowChange
     client.PutRow(putRowRequest)
     fmt.Println("put order succeed")
}

查询数据

示例代码中查询订单号order_id为“o1”的记录

func getOrder(client *tablestore.TableStoreClient)  {
     getRowRequest := new(tablestore.GetRowRequest)
     criteria := new(tablestore.SingleRowQueryCriteria)
     putPk := new(tablestore.PrimaryKey)
     putPk.AddPrimaryKeyColumn("order_id", "o1")//设置读取的主键
     criteria.PrimaryKey = putPk
     getRowRequest.SingleRowQueryCriteria = criteria
     getRowRequest.SingleRowQueryCriteria.TableName = "order"//设置表名
     getRowRequest.SingleRowQueryCriteria.MaxVersion = 1
     getResp, _ := client.GetRow(getRowRequest)
     fmt.Println("get row result is :",getResp.PrimaryKey, getResp.Columns[0].ColumnName, getResp.Columns[0].Value)
}

创建多元索引

示例代码中创建了一个多元索引order_index。分别设置customer_name字符串类型、order_time字符串类型、pay_time字符串类型、product_name分词类型、product_type字符串类型。关于索引字段类型的介绍请参考多元索引概述

func createSearchIndex(client *tablestore.TableStoreClient){
     request := &tablestore.CreateSearchIndexRequest{}
     request.TableName = "order" //设置数据表名称。
     request.IndexName = "order_index" //设置多元索引名称。
     schemas := []*tablestore.FieldSchema{}
     field1 := &tablestore.FieldSchema{
        FieldName: proto.String("customer_name"), //设置字段名
        FieldType: tablestore.FieldType_KEYWORD, //设置字段类型。
        Index:     proto.Bool(true), //设置开启索引。
        EnableSortAndAgg: proto.Bool(true), //设置开启排序与统计聚合功能。
     }
     field2 := &tablestore.FieldSchema{
        FieldName: proto.String("order_time"),
        FieldType: tablestore.FieldType_KEYWORD,
        Index:     proto.Bool(true),
        EnableSortAndAgg: proto.Bool(true),
     }
     field3 := &tablestore.FieldSchema{
        FieldName: proto.String("pay_time"),
        FieldType: tablestore.FieldType_KEYWORD,
        Index:     proto.Bool(true),
        EnableSortAndAgg: proto.Bool(true),
     }
     field4 := &tablestore.FieldSchema{
        FieldName: proto.String("product_name"),
        FieldType: tablestore.FieldType_TEXT,
        Index:     proto.Bool(true),
        EnableSortAndAgg: proto.Bool(false),
     }
     field5 := &tablestore.FieldSchema{
        FieldName: proto.String("product_type"),
        FieldType: tablestore.FieldType_KEYWORD,
        Index:     proto.Bool(true),
        EnableSortAndAgg: proto.Bool(true),
     }
     schemas = append(schemas,field1,field2,field3,field4,field5)
     request.IndexSchema = &tablestore.IndexSchema{
        FieldSchemas: schemas, //设置多元索引包含的字段。
     }
     client.CreateSearchIndex(request) //调用client创建多元索引。
     fmt.Println("CreateSearchIndex finished")
}

搜索数据

示例代码中查询产品类型为“手机”的订单,并统计了符合条件的行数。

func searchQuery1(client *tablestore.TableStoreClient){
     searchRequest := &tablestore.SearchRequest{}
     searchRequest.
        SetTableName("order1"). //设置表名
        SetIndexName("order_index").    //设置多元索引名
        SetSearchQuery(search.NewSearchQuery().
       SetQuery(&search.TermQuery{"product_type","手机"}).
       SetLimit(10).SetGetTotalCount(true))
     //设置返回所有列
     searchRequest.SetColumnsToGet(&tablestore.ColumnsToGet{
        ReturnAll: true,
     })
     searchResponse, _ := client.Search(searchRequest)
     for _, row := range searchResponse.Rows {
        jsonBody, err := json.Marshal(row)
        if err != nil {
       panic(err)
        }
        fmt.Println("Row: ", string(jsonBody))
     }
}

示例代码中搜索产品名包含“iphone”的订单,并统计了符合条件的行数。

func searchQuery2(client *tablestore.TableStoreClient){
     searchRequest := &tablestore.SearchRequest{}
     searchRequest.SetTableName("order")
     searchRequest.SetIndexName("order_index")
     query := &search.MatchQuery{} //设置查询类型为MatchQuery。
     query.FieldName = "product_name" //设置要匹配的字段。
     query.Text = "iphone" //设置要匹配的值。
     searchQuery := search.NewSearchQuery()
     searchQuery.SetQuery(query)
     searchQuery.SetGetTotalCount(true)
     //设置返回所有列
     searchRequest.SetColumnsToGet(&tablestore.ColumnsToGet{
        ReturnAll:true,
     })
     searchRequest.SetSearchQuery(searchQuery)
     searchResponse, _ := client.Search(searchRequest)
     for _, row := range searchResponse.Rows {
        jsonBody, err := json.Marshal(row)
        if err != nil {
       panic(err)
        }
        fmt.Println("Row: ", string(jsonBody))
     }
}

示例代码中查询了消费者姓名为“消十一”并且下单时间在“2021-10-24 00:00:00”之间的订单。并统计了行数。

func searchQuery3(client *tablestore.TableStoreClient) {
     searchRequest := &tablestore.SearchRequest{}
     searchRequest.SetTableName("order")
     searchRequest.SetIndexName("order_index")
     //设置返回所有列
     searchRequest.SetColumnsToGet(&tablestore.ColumnsToGet{
        ReturnAll: true,
     })
     termQuery := &search.TermQuery{}
     termQuery.FieldName = "customer_name"
     termQuery.Term = "消十一"
     rangeQuery := &search.RangeQuery{}
     rangeQuery.FieldName = "order_time"
     rangeQuery.LT("2021-10-24 00:00:00")
     {
        boolQuery := &search.BoolQuery{
       MustQueries: []search.Query{
        termQuery,
        rangeQuery,
       },
        }
        searchQuery := search.NewSearchQuery()
        searchQuery.SetQuery(boolQuery)
        searchRequest.SetSearchQuery(searchQuery)
        searchResponse, _ := client.Search(searchRequest)
        for _, row := range searchResponse.Rows {
       jsonBody, err := json.Marshal(row)
       if err != nil {
        panic(err)
       }
       fmt.Println("Row: ", string(jsonBody))
        }
     }
}

删除多元索引

示例代码中展示了删除订单表order中的order_index多元索引。

func deleteSearchIndex(client *tablestore.TableStoreClient)  {
     request := &tablestore.DeleteSearchIndexRequest{}
     request.TableName = "order" //设置数据表名称。
     request.IndexName = "order_index" //设置多元索引名称。
     client.DeleteSearchIndex(request) //调用client删除多元索引。
     fmt.Println("DeleteSearchIndex finished")
}

删除数据表

示例代码中展示了删除订单表order。删除表之前需确保先删除表中的多元索引。

func deleteTable(client *tablestore.TableStoreClient){
     deleteTableRequest := new(tablestore.DeleteTableRequest)
     deleteTableRequest.TableName = "order"//设置表名
     client.DeleteTable(deleteTableRequest)//发送删除数据表请求
     fmt.Println("Delete table finished")
}

更多关于Tablestore Go SDK的介绍请参考Tablestore Go SDK

若有收获,就点个赞吧

上一篇:表格存储快速上手准备


下一篇:轻量应用服务器,独享云虚拟主机、共享云虚拟主机、云服务器 ECS 的区别?