准备工作
在您开始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。
若有收获,就点个赞吧