正确的Boto AWS DynamoDb .scan语法

0 投票
1 回答
3968 浏览
提问于 2025-04-18 12:43

我最近在用Dynamo和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表中的scan函数一致: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”是Dynamo表中的一列,并且在“advertiser”中至少有一个元素等于adv(“itunes.apple.com”)。但是我得到了以下错误:

追踪(最近的调用最后): 文件 "/Users/tai/Documents/workspace/testSelenium/testS/init.py",第101行,在 forInFile() 文件 "/Users/tai/Documents/workspace/testSelenium/testS/init.py",第95行,在 forInFile dynamoAccess.getByAdvertiser("itunes.apple.com") 文件 "/Users/tai/Documents/workspace/testSelenium/testS/dynamoAccess.py",第34行,在 getByAdvertiser matchingTable=swfTable.scan(advertiser__eq=adv) 文件 "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/boto/dynamodb/table.py",第518行,在 scan 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 个回答

1

你找到的这两个例子都是在使用传统的低级API。比如在旧的API中,scan函数需要一个叫做scanFilter的参数。

而像下面这样的语法

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

是在新的高级API中定义的。

你绝对应该切换到DynamoDB2。从你的错误信息来看

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

似乎你在使用DynamoDB而不是DynamoDB2,因为layer2 API是在DynamoDB API中定义的,而在DynamoDB2中没有这个。

所以,切换到boto DynamoDB2吧。

1) 获取你的表

2) 使用table.scan(age__in=[25, 26, 27, 28, 29], limit=1),具体可以查看这里

撰写回答