如何仅使用 boto 2.25.0 通过全局二级索引查询 DynamoDB2 表? [英] How do I query DynamoDB2 table by global secondary index only using boto 2.25.0?
问题描述
这是我从常规 DynamoDB 表切换到具有全局二级索引的 DynamoDB2 表的继续**.
This is a continuation** of my quest to switch from regular DynamoDB tables to DynamoDB2 ones with Global Secondary Indices.
所以我创建了我的表,如图 这里,然后添加以下两个元素:
So I created my table as shown here and then added the following two elements:
table.put_item(data={'firstKey': 'key01', 'message': '{"firstKey":"key01", "comments": "mess 1 w/o secondKey"}'})
table.put_item(data={'firstKey': 'key02', 'secondKey':'skey01', 'message': '{"firstKey":"key02", "parentId":"skey01", "comments": "mess 2 w/ secondKey"}'})
我现在要做的是通过 (i) 唯一的 firstKey
值或 (ii) 唯一的 secondKey
值检索项目.第一个很简单:
What I want to do now is retrieve items by either their (i) unique firstKey
values or (ii) unique secondKey
values. The 1st one is easy:
res1 = table.get_item(firstKey='key01')
res1['message']
我不知道如何做第二个.这不起作用:
I can't figure out how to do the 2nd one. This does not work:
res2 = table.get_item(secondKey='skey01')
生成提供的关键元素与架构不匹配
.好的,这是预期的.当我这样做时:
producing The provided key element does not match the schema
. OK that's expected. When I do this:
res2 = table.query(secondKey='skey01',index='secondKeyIndex')
我得到 您必须指定多个键才能过滤
.
那么我该如何让它工作呢?请注意,当我有一个项目的 secondKey
值时,我不知道它对应的 firstKey
.
So how do I get it to work? Note that when I have the value of secondKey
of an item, I do NOT know its corresponding firstKey
.
=====更新:这是我尝试过的其他几件事:
===== UPDATE: Here are a couple of other things that I've tried:
这个
res2 = table.query(secondKey__eq='skey01',index='secondKeyIndex')
生产
boto.dynamodb2.exceptions.QueryError: You must specify more than one key to filter on.
在下面的块中,query
语句没有产生任何错误
In the block below, the query
statement did not produce any errors
res2 = table.query(secondKey='skey01',secondKey__eq='skey01',index='secondKeyIndex')
for r in res2:
print res2['secondKey']
但是print
给了我
boto.dynamodb2.exceptions.UnknownFilterTypeError: Operator 'secondKey' from 'secondKey' is not recognized.
推荐答案
可以使用LSI/GSI.
It is possible using LSI/GSI.
请参阅此处的 boto 教程(搜索 LSI,您将获得示例).DynamoDB2 — boto v2.25.0:http://boto.readthedocs.org/en/最新/ref/dynamodb2.html
See the boto tutorial here (search for LSI, and you will get the example). DynamoDB2 — boto v2.25.0 : http://boto.readthedocs.org/en/latest/ref/dynamodb2.html
添加一个完整的工作示例(尝试使用本地发电机:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.DynamoDBLocal.html)
Adding a full working example (tried with dynamo local: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.DynamoDBLocal.html)
conn = DynamoDBConnection(
host='localhost',
port=8000,
aws_access_key_id='DEVDB', #anything will do
aws_secret_access_key='DEVDB', #anything will do
is_secure=False)
tables = conn.list_tables()
print "Before Creation:", tables
table_name = 'myTable'
if table_name not in tables['TableNames']:
Table.create(table_name
, schema=[HashKey('firstKey')]
, throughput={'read': 5, 'write': 2}
, global_indexes=[
GlobalAllIndex('secondKeyIndex', parts=[HashKey('secondKey')], throughput={'read': 5, 'write': 3})]
, connection=conn
)
#print_table_details(conn, table_name)
table = Table(table_name, connection=conn)
item = Item(table, data={
'firstKey': str(uuid.uuid4()),
'secondKey': 'DUMMY-second'
})
item.save()
results = table.query(secondKey__eq='DUMMY-second', index='secondKeyIndex')
for res in results:
print res['firstKey'], res['secondKey']
执行结果是:
91d4d056-1da3-42c6-801e-5b8e9c42a93f DUMMY-second
15c17b09-4975-419a-b603-427e4c765f03 DUMMY-second
dd947b7d-935e-458f-84d3-ed6cd4f32f5a DUMMY-second
同时添加确切的包(由于 Dynamo1/2 - 有可能出错):
Also adding the exact packages (Due to Dynamo1/2 - there is chance of mistake):
from boto.dynamodb2.fields import HashKey, RangeKey, GlobalAllIndex
from boto.dynamodb2.layer1 import DynamoDBConnection
from boto.dynamodb2.table import Table
from boto.dynamodb2.items import Item
这篇关于如何仅使用 boto 2.25.0 通过全局二级索引查询 DynamoDB2 表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!