准备工作
在您开始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)等信息。代码如下
funcmain() { client :=tablestore.NewClient("https://order-instance.cn-beijing.ots.aliyuncs.com",//your endpoint,此处可选择公网地址"order-instance",//your instance name"",//your accessKeyId"")//your accessSecretcreateOrderTable(client) }
创建数据表
示例代码中创建了一张订单数据表order。
funccreateOrderTable(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=-1tableOption.MaxVersion=1reservedThroughput :=new(tablestore.ReservedThroughput) reservedThroughput.Readcap=0reservedThroughput.Writecap=0createtableRequest.TableMeta=tableMetacreatetableRequest.TableOption=tableOptioncreatetableRequest.ReservedThroughput=reservedThroughputclient.CreateTable(createtableRequest)//发送创建数据表请求fmt.Println("create table succeed") }
写入数据
示例代码中写入了一条订单数据,订单号order_id为“o1”。样例中模拟了一万条订单数据,这里不作展示。
funcputOrder(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_IGNOREputRowChange.SetCondition(tablestore.RowExistenceExpectation_IGNORE) putRowChange.ReturnType=tablestore.ReturnType_RT_PKputRowRequest.PutRowChange=putRowChangeclient.PutRow(putRowRequest) fmt.Println("put order succeed") }
查询数据
示例代码中查询订单号order_id为“o1”的记录
funcgetOrder(client*tablestore.TableStoreClient) { getRowRequest :=new(tablestore.GetRowRequest) criteria :=new(tablestore.SingleRowQueryCriteria) putPk :=new(tablestore.PrimaryKey) putPk.AddPrimaryKeyColumn("order_id", "o1")//设置读取的主键criteria.PrimaryKey=putPkgetRowRequest.SingleRowQueryCriteria=criteriagetRowRequest.SingleRowQueryCriteria.TableName="order"//设置表名getRowRequest.SingleRowQueryCriteria.MaxVersion=1getResp, _ :=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字符串类型。关于索引字段类型的介绍请参考多元索引概述。
funccreateSearchIndex(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") }
搜索数据
示例代码中查询产品类型为“手机”的订单,并统计了符合条件的行数。
funcsearchQuery1(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 :=rangesearchResponse.Rows { jsonBody, err :=json.Marshal(row) iferr!=nil { panic(err) } fmt.Println("Row: ", string(jsonBody)) } }
示例代码中搜索产品名包含“iphone”的订单,并统计了符合条件的行数。
funcsearchQuery2(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 :=rangesearchResponse.Rows { jsonBody, err :=json.Marshal(row) iferr!=nil { panic(err) } fmt.Println("Row: ", string(jsonBody)) } }
示例代码中查询了消费者姓名为“消十一”并且下单时间在“2021-10-24 00:00:00”之间的订单。并统计了行数。
funcsearchQuery3(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 :=rangesearchResponse.Rows { jsonBody, err :=json.Marshal(row) iferr!=nil { panic(err) } fmt.Println("Row: ", string(jsonBody)) } } }
删除多元索引
示例代码中展示了删除订单表order中的order_index多元索引。
funcdeleteSearchIndex(client*tablestore.TableStoreClient) { request :=&tablestore.DeleteSearchIndexRequest{} request.TableName="order"//设置数据表名称。request.IndexName="order_index"//设置多元索引名称。client.DeleteSearchIndex(request) //调用client删除多元索引。fmt.Println("DeleteSearchIndex finished") }
删除数据表
示例代码中展示了删除订单表order。删除表之前需确保先删除表中的多元索引。
funcdeleteTable(client*tablestore.TableStoreClient){ deleteTableRequest :=new(tablestore.DeleteTableRequest) deleteTableRequest.TableName="order"//设置表名client.DeleteTable(deleteTableRequest)//发送删除数据表请求fmt.Println("Delete table finished") }
更多关于Tablestore Go SDK的介绍请参考Tablestore Go SDK。
若有收获,就点个赞吧