表格存储 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
目录
相关文章
|
2月前
|
人工智能 安全 算法
Go入门实战:并发模式的使用
本文详细探讨了Go语言的并发模式,包括Goroutine、Channel、Mutex和WaitGroup等核心概念。通过具体代码实例与详细解释,介绍了这些模式的原理及应用。同时分析了未来发展趋势与挑战,如更高效的并发控制、更好的并发安全及性能优化。Go语言凭借其优秀的并发性能,在现代编程中备受青睐。
109 33
|
21天前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
153 61
|
2月前
|
人工智能 自然语言处理 开发工具
HarmonyOS NEXT~鸿蒙开发能力:HarmonyOS SDK AI 全解析
本文深入解析HarmonyOS SDK中的AI功能集,涵盖分布式AI引擎、核心组件(NLP、计算机视觉等)及智能决策能力。通过代码示例与开发实践指南,帮助开发者掌握环境配置、性能调优及多场景应用(智能家居、移动办公等)。同时探讨性能优化策略与未来演进方向,助力构建高效分布式智能应用。
115 9
|
5月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
290 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
2月前
|
人工智能 缓存 安全
Go开发遇见的一次Data Race
本文通过一段 Go 语言代码示例,分析了并发编程中的数据竞争(Data Race)问题。代码实现了一个带缓存的内存存储系统,包含 `LRUCache` 和 `MemoryCache` 两个核心组件。尽管在 `MemoryCache` 的 `Set` 方法中加了锁保护,但由于直接调用 `LRUCache` 的 `GetLength` 方法时未加锁,导致底层数据结构在多 goroutine 环境下被同时读写,从而触发 Data Race。文章详细解析了问题根源,并提出了解决方案:为 `LRUCache` 的 `Add` 方法添加锁保护,确保并发安全。
|
3月前
|
存储 算法 数据可视化
【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)
本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。
185 10
|
4月前
|
存储 开发工具 开发者
揭秘 Microsoft.Docker.SDK:让容器开发更轻松的强大工具揭秘
随着云计算和容器技术的快速发展,`Docker` 已经成为容器化技术的事实标准。`Microsoft` 作为 `Docker` 的主要支持者和参与者,推出了 `Microsoft.Docker.SDK`,旨在帮助开发者更轻松地进行容器开发。本文将深入揭秘 Microsoft.Docker.SDK 的功能、使用方法以及它在容器开发中的应用。
131 12
|
3月前
|
Go API 定位技术
MCP 实战:用 Go 语言开发一个查询 IP 信息的 MCP 服务器
随着 MCP 的快速普及和广泛应用,MCP 服务器也层出不穷。大多数开发者使用的 MCP 服务器开发库是官方提供的 typescript-sdk,而作为 Go 开发者,我们也可以借助优秀的第三方库去开发 MCP 服务器,例如 ThinkInAIXYZ/go-mcp。 本文将详细介绍如何在 Go 语言中使用 go-mcp 库来开发一个查询 IP 信息的 MCP 服务器。
188 0
|
5月前
|
前端开发 JavaScript 开发工具
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
296 5
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
5月前
|
存储 Go
Go 语言入门指南:切片
Golang中的切片(Slice)是基于数组的动态序列,支持变长操作。它由指针、长度和容量三部分组成,底层引用一个连续的数组片段。切片提供灵活的增减元素功能,语法形式为`[]T`,其中T为元素类型。相比固定长度的数组,切片更常用,允许动态调整大小,并且多个切片可以共享同一底层数组。通过内置的`make`函数可创建指定长度和容量的切片。需要注意的是,切片不能直接比较,只能与`nil`比较,且空切片的长度为0。
124 3
Go 语言入门指南:切片