ali表格存储之查询

最近换了工作,有一段时间没有更新了。最近我们使用了阿里的表格储存服务,不同于关系型数据库,表格存储(Table Store)是阿里云自研的NoSQL多模型数据库,提供海量结构化数据存储以及快速的查询和分析服务。

表格储存不能和关系型数据库一样使用外键,连表查询,建立视图。基本的增删改查还是大同小异的;

表格储存可以使用主键查询,也可以使用索引去查询,个人还是比较喜欢利用索引去查询的,因为有时候由于业务逻辑的限制,主键并不是每次都能拿到的;

现有表demo_test, 其中code为主键, 拥有元素 name, type, location(坐标), price

主键查询:

primary_key = [('code', code)] #指明主键,当该表存在多个主键时,查询的时候需要都加上(这也是我不喜欢主键查询的原因,而且先后顺序要与页面上建表顺序一致)
ots_client = OTSClient(OTS_END_POINT, AL_AccessKeyId, AL_AccessKeySecret, OTS_INS)
consumed, return_row, next_token = ots_client.get_row('demo_test',primary_key)

索引查询:

首先我们要在我们的控制台,或者使用代码,给这个表创建我们所需要的索引。如上表 我们将name,type,price 统一划分到索引demo_model中。

现在我要做查询,name为 收音机, type 不为 -1(损坏),价格小于等于30块或者大于10块

那么我们的查询就可以这么写

search_query = BoolQuery(

must_queries=[

TermQuery('name', '收音机'),

],#must_queries代表必须满足的条件

must_not_queries=[

TermQuery('type ', -1),

],#must_not_queries代表必须排除满足的条件

should_not_queries=[

RangeQuery('price', range_to = 30.0, include_upper=True),

RangeQuery('price', range_from = 10.0, include_lower=False)

],#should_not_queries代表至少满足一个的条件

)

当然must_queries, must_not_queries, should_not_queries,他们的关系是and的关系,我们可以在使用嵌套BoolQuery的形式来实现我们更加复杂的业务需求。

ots_client = OTSClient(OTS_END_POINT, AL_AccessKeyId, AL_AccessKeySecret, OTS_INS)

return_row,next_token,count,succeed=ots_client.search('demo_test','demo_model', 

SearchQuery(search_query ,#查询条件

limit=100,#限制条数

sort=Sort(sorters=[FieldSort('price',SortOrder.ASC)]),#按照某个字段排序

get_total_count=True),

ColumnsToGet(return_type=ColumnReturnType.ALL))#是否返回所有字段,当然我们也可以传入一个数组用来指定返回某些字段ColumnsToGet(demo_list, ColumnReturnType.SPECIFIED)

地理位置字段查询:

根据一个中心点和距离条件查询表中的数据,当一个地理位置点到指定的中心点的距离不超过指定的值时,满足查询条件。

例如 查询我附近100米的数据 我们将location字段加入到索引demo_location中

query = GeoDistanceQuery('location', '34.11, 118.12', 100)

ots_client = OTSClient(OTS_END_POINT, AL_AccessKeyId, AL_AccessKeySecret, OTS_INS)

return_row, next_token, total_count, is_all_succeed = ots_client .search('demo', 'demo_location',

SearchQuery(query, limit=100,get_total_count=True)),

ColumnsToGet(return_type=ColumnReturnType.ALL)

return_row代表返回的结果,是以列表的形式返回的,里面有两个元组,一个是主键,一个是元素

next_token即代表翻页要用到的元素,本次查询的结果并没有返回完,当我们再次请求时可以带上next_token,那么数据将会接着上次的数据进行返回

我们获取返回的结果是可以这样

data_list = []

for icon in return_row:

     data_dict = dict(icon[0])

     data_dict.update([(n, v) for n, v, s in icon[1]])

     data_list.append(data_dict)

 

你可能感兴趣的:(ali服务)