2014-07-10 46 views
0

我一直在使用Dynamo & Python一段时间,但我已经遇到了似乎在语法上不匹配。正确Boto aws DynamoDb .scan语法

我读:

# 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 这似乎与在博托表扫描功能同意: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()返回元素,“advertiser”是一个发电机t “广告客户”中至少存在一个等于adv(“itunes.apple.com”)的元素。然而,我收到以下错误:

Traceback (most recent call last): File "/Users/tai/Documents/workspace/testSelenium/testS/init.py", line 101, in forInFile() File "/Users/tai/Documents/workspace/testSelenium/testS/init.py", line 95, in forInFile dynamoAccess.getByAdvertiser("itunes.apple.com") File "/Users/tai/Documents/workspace/testSelenium/testS/dynamoAccess.py", line 34, in getByAdvertiser matchingTable=swfTable.scan(advertiser__eq=adv) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/boto/dynamodb/table.py", line 518, in scan return self.layer2.scan(self, *args, **kw) TypeError: scan() got an unexpected keyword argument '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

您发现的两个示例均使用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因为layer2 API在DynamoDB API定义,它消失在DynamoDB2你。

所以切换博托DynamoDB2

1)get your table

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