正确的Boto aws DynamoDb .scan语法

时间:2014-07-10 00:06:26

标签: python python-2.7 amazon-web-services boto amazon-dynamodb

我一直在使用Dynamo& amp; Python已经有一段时间了但是我已经遇到了似乎在语法上不匹配的问题。

我看了:

# All results.
>>> everything = users.scan()

# Look for last names beginning with "D".
>>> results = users.scan(last_name__beginswith='D')
>>> for res in results:
...     print res['first_name']
'Alice'
'John'
'Jane'

# Use an ``IN`` filter & limit.
>>> results = users.scan(
...     age__in=[25, 26, 27, 28, 29],
...     limit=1
... )
>>> for res in results:
...     print res['first_name']
'Alice'

来自:http://boto.readthedocs.org/en/latest/ref/dynamodb2.html 这似乎与boto表中的扫描功能一致:https://github.com/boto/boto/blob/433f211b5eb93560916a4bd4a1dbf905e6c13a58/boto/dynamodb2/table.py

问题出在我尝试的时候:

def getByAdvertiser(adv):
    matchingTable=swfTable.scan(advertiser__eq=adv)
    return getTableElements(matchingTable)
def getTableElements(table):
    res=[]
    for t in table:
        res.append(t)
    return res

基于上述语法应该有效,因为swfTable是一个有效的表,.scan()返回元素,"广告客户"是一个发电机表列,"广告客户"中至少有一个元素。这等于adv(" itunes.apple.com")。但是我得到以下错误:

  

Traceback(最近一次调用最后一次):文件   " / Users / tai / Documents / workspace / testSelenium / testS / init .py",line   101,在       forInFile()文件" / Users / tai / Documents / workspace / testSelenium / testS / init .py",line   95,inInFile       dynamoAccess.getByAdvertiser(" itunes.apple.com")File" /Users/tai/Documents/workspace/testSelenium/testS/dynamoAccess.py",   第34行,在getByAdvertiser中       matchingTable = swfTable.scan(advertiser__eq = adv)File" /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/boto/dynamodb/table.py",   第518行,在扫描中       return self.layer2.scan(self,* args,** kw)TypeError:scan()得到了一个意外的关键字参数' advertiser__eq'

我不知道我是如何不遵循文档的语法的。

然而,当我查看其他Boto dynamodb问题时,他们使用的语法如下:

results = self.table.scan(scan_filter={'asset': dynamodb.condition.EQ(asset)})

来自:

  

Trouble getting a dynamodb scan to work with boto

或者:

all_query = table.scan(attributes_to_get=['something'])

来自:boto python dynamodb scan attributes_to_get

这看起来与我使用的内容或我见过的任何内容完全不同。

编辑:

我认为问题可能是我一直在使用dynamodb1而不是2.

aws_dynamo_table="decompiled_swf_text"
conn= S3Connection(aws_access_key_id,aws_secret_access_key);
dynamoConn = boto.connect_dynamodb(aws_access_key_id, aws_secret_access_key)
dTable = dynamoConn.get_table(aws_dynamo_table)

使用dynamodb2可以解决这个问题吗?如果是这样,我怎么设置它?我正在尝试:

dynamoConn = dynamodb2.layer1.DynamoDBConnection(region=RegionInfo(name=aws_dynamo_region,endpoint='dynamodb.us-east-1.amazonaws.com'),aws_access_key_id,aws_secret_access_key)

但是,我不知道如何查询和扫描表格......我没有看到可用的功能。

1 个答案:

答案 0 :(得分:1)

您找到的两个示例都使用traditional/low-level API。例如,在旧API中,scan函数将scanFilter作为参数。

语法如

>>> results = users.scan(
...     age__in=[25, 26, 27, 28, 29],
...     limit=1
... )

new/high level API中定义。

你一定要切换到DynamoDB2。来自您的错误输出

in scan return self.layer2.scan(self, *args, **kw) TypeError:

似乎您使用的是DynamoDB而不是DynamoDB2,因为在DynamoDB api中定义了layer2 API,它在DynamoDB2中消失了。

所以切换boto DynamoDB2

1)get your table

2)使用table.scan(age__in = [25,26,27,28,29],limit = 1)见here