首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何仅使用boto 2.25.0通过全局辅助索引查询DynamoDB2表?

如何仅使用boto 2.25.0通过全局辅助索引查询DynamoDB2表?
EN

Stack Overflow用户
提问于 2014-02-13 19:07:07
回答 3查看 14.4K关注 0票数 4

这是我从常规DynamoDB表切换到具有全局辅助索引的DynamoDB2表的任务的延续**。

因此,我创建了我的表,如here所示,然后添加了以下两个元素:

代码语言:javascript
复制
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值来检索条目。第一个很简单:

代码语言:javascript
复制
res1 = table.get_item(firstKey='key01')
res1['message']

我不知道怎么做第二个。这样做是行不通的:

代码语言:javascript
复制
res2 = table.get_item(secondKey='skey01')

生产The provided key element does not match the schema。好吧,这是意料之中的。当我这么做时:

代码语言:javascript
复制
res2 = table.query(secondKey='skey01',index='secondKeyIndex')

我得到了You must specify more than one key to filter on

那我怎么才能让它起作用?注意,当我有一个项的secondKey值时,我不知道它对应的firstKey

=====更新:下面是我尝试过的其他几件事情:

代码语言:javascript
复制
res2 = table.query(secondKey__eq='skey01',index='secondKeyIndex')

生产的

代码语言:javascript
复制
boto.dynamodb2.exceptions.QueryError: You must specify more than one key to filter on.

在下面的块中,query语句没有产生任何错误。

代码语言:javascript
复制
res2 = table.query(secondKey='skey01',secondKey__eq='skey01',index='secondKeyIndex')
for r in res2:
    print res2['secondKey']

但是print给了我

代码语言:javascript
复制
boto.dynamodb2.exceptions.UnknownFilterTypeError: Operator 'secondKey' from 'secondKey' is not recognized.
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-14 18:10:54

使用LSI/GSI是可能的。

请参阅这里的boto教程(搜索LSI,您将得到这个示例)。DynamoDB2 - boto v2.25.0:http://boto.readthedocs.org/en/latest/ref/dynamodb2.html

添加一个完整的工作示例(使用dynamo:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.DynamoDBLocal.html进行尝试)

代码语言:javascript
复制
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']

执行的结果是:

代码语言:javascript
复制
91d4d056-1da3-42c6-801e-5b8e9c42a93f DUMMY-second
15c17b09-4975-419a-b603-427e4c765f03 DUMMY-second
dd947b7d-935e-458f-84d3-ed6cd4f32f5a DUMMY-second

还添加了确切的包(由于Dynamo1 1/2-有可能出错):

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2014-12-12 04:04:18

对于所有在使用query_2时寻找更新版本的用户,请查看https://github.com/boto/boto/issues/2708

票数 1
EN

Stack Overflow用户

发布于 2014-02-14 16:59:17

查询参数的格式不同。我还没有试过,但我认为语法应该是:

代码语言:javascript
复制
res2 = table.query(secondKey__eq='skey01',index='secondKeyIndex')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21763312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档