最近换了工作,有一段时间没有更新了。最近我们使用了阿里的表格储存服务,不同于关系型数据库,表格存储(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)