表格存储 Go SDK 开发入门

本文涉及的产品
表格存储 Tablestore,50G 2个月
简介: 本文将结合电商订单场景为例,介绍表格存储 Tablestore 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)等信息。代码如下

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

若有收获,就点个赞吧

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
阿里云表格存储使用教程
表格存储(Table Store)是构建在阿里云飞天分布式系统之上的分布式NoSQL数据存储服务,根据99.99%的高可用以及11个9的数据可靠性的标准设计。表格存储通过数据分片和负载均衡技术,实现数据规模与访问并发上的无缝扩展,提供海量结构化数据的存储和实时访问。 产品详情:https://www.aliyun.com/product/ots
目录
相关文章
|
11天前
|
存储 设计模式 安全
Go语言中的并发编程:从入门到精通###
本文深入探讨了Go语言中并发编程的核心概念与实践技巧,旨在帮助读者从理论到实战全面掌握Go的并发机制。不同于传统的技术文章摘要,本部分将通过一系列生动的案例和代码示例,直观展示Go语言如何优雅地处理并发任务,提升程序性能与响应速度。无论你是Go语言初学者还是有一定经验的开发者,都能在本文中找到实用的知识与灵感。 ###
|
16天前
|
Serverless Go
Go语言中的并发编程:从入门到精通
本文将深入探讨Go语言中并发编程的核心概念和实践,包括goroutine、channel以及sync包等。通过实例演示如何利用这些工具实现高效的并发处理,同时避免常见的陷阱和错误。
|
18天前
|
Go 数据安全/隐私保护 开发者
Go语言开发
【10月更文挑战第26天】Go语言开发
32 3
|
20天前
|
Java 程序员 Go
Go语言的开发
【10月更文挑战第25天】Go语言的开发
26 3
|
28天前
|
安全 Go 开发者
破译Go语言中的并发模式:从入门到精通
在这篇技术性文章中,我们将跳过常规的摘要模式,直接带你进入Go语言的并发世界。你将不会看到枯燥的介绍,而是一段代码的旅程,从Go的并发基础构建块(goroutine和channel)开始,到高级模式的实践应用,我们共同探索如何高效地使用Go来处理并发任务。准备好,让Go带你飞。
|
1月前
|
存储 安全 Go
Go语言切片:从入门到精通的深度探索###
本文深入浅出地剖析了Go语言中切片(Slice)这一核心概念,从其定义、内部结构、基本操作到高级特性与最佳实践,为读者提供了一个全面而深入的理解。通过对比数组,揭示切片的灵活性与高效性,并探讨其在并发编程中的应用优势。本文旨在帮助开发者更好地掌握切片,提升Go语言编程技能。 ###
|
3月前
|
数据采集 开发工具 Python
海康威视工业相机SDK+Python+PyQt开发数据采集系统(支持软件触发、编码器触发)
该系统基于海康威视工业相机SDK,使用Python与PyQt开发,支持Gige与USB相机设备的搜索及双相机同时显示。系统提供软件触发与编码器触发模式,并可在数据采集过程中实时保存图像。此外,用户可以调节曝光时间和增益,并进行信息输入,这些信息将被保存至配置文件以便下次自动加载。参数调节与实时预览等功能进一步增强了系统的实用性。
198 1
|
3月前
|
Unix Go
Go从入门到放弃之时间操作
Go从入门到放弃之时间操作
|
3月前
|
机器学习/深度学习 移动开发 Linux
Go从入门到放弃之文件操作
Go从入门到放弃之文件操作
|
3月前
|
Java Go PHP
Go从入门到放弃之错误处理
Go从入门到放弃之错误处理