表格存储 Go SDK 开发入门

简介: 本文将结合电商订单场景为例,介绍表格存储 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

若有收获,就点个赞吧

相关实践学习
阿里云表格存储使用教程
表格存储(Table Store)是构建在阿里云飞天分布式系统之上的分布式NoSQL数据存储服务,根据99.99%的高可用以及11个9的数据可靠性的标准设计。表格存储通过数据分片和负载均衡技术,实现数据规模与访问并发上的无缝扩展,提供海量结构化数据的存储和实时访问。 产品详情:https://www.aliyun.com/product/ots
目录
相关文章
|
9月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
626 4
|
人工智能 安全 算法
Go入门实战:并发模式的使用
本文详细探讨了Go语言的并发模式,包括Goroutine、Channel、Mutex和WaitGroup等核心概念。通过具体代码实例与详细解释,介绍了这些模式的原理及应用。同时分析了未来发展趋势与挑战,如更高效的并发控制、更好的并发安全及性能优化。Go语言凭借其优秀的并发性能,在现代编程中备受青睐。
482 33
|
11月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
1101 0
|
9月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
680 43
Go语言深度解析:从入门到精通的完整指南
|
9月前
|
JavaScript 前端开发 Java
【GoWails】Go做桌面应用开发?本篇文章带你上手Wails框架!一步步带你玩明白前后端双端的数据绑定!
wails是一个可以让你使用Go和Web技术编写桌面应用的项目 可以将它看作Go的快并且轻量级的Electron替代品。可以使用Go的功能,并结合现代化UI完成桌面应用程序的开发
1560 5
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
567 61
|
10月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
开发框架 安全 前端开发
Go Web开发框架实践:模板渲染与静态资源服务
Gin 是一个功能强大的 Go Web 框架,不仅适用于构建 API 服务,还支持 HTML 模板渲染和静态资源托管。它可以帮助开发者快速搭建中小型网站,并提供灵活的模板语法、自定义函数、静态文件映射等功能,同时兼容 Go 的 html/template 引擎,具备高效且安全的页面渲染能力。
|
人工智能 缓存 安全
Go开发遇见的一次Data Race
本文通过一段 Go 语言代码示例,分析了并发编程中的数据竞争(Data Race)问题。代码实现了一个带缓存的内存存储系统,包含 `LRUCache` 和 `MemoryCache` 两个核心组件。尽管在 `MemoryCache` 的 `Set` 方法中加了锁保护,但由于直接调用 `LRUCache` 的 `GetLength` 方法时未加锁,导致底层数据结构在多 goroutine 环境下被同时读写,从而触发 Data Race。文章详细解析了问题根源,并提出了解决方案:为 `LRUCache` 的 `Add` 方法添加锁保护,确保并发安全。
174 1
|
SQL 监控 Go
新一代 Cron-Job分布式调度平台,v1.0.8版本发布,支持Go执行器SDK!
现代化的Cron-Job分布式任务调度平台,支持Go语言执行器SDK,多项核心优势优于其他调度平台。
339 8