【问题标题】:Correct Boto aws DynamoDb .scan syntax正确的 Boto aws DynamoDb .scan 语法
【发布时间】:2014-07-10 13:37:36
【问题描述】:

我使用 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 表中的扫描功能一致: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”是一个发电机表列,并且“advertiser”中至少存在一个等于的元素到广告(“itunes.apple.com”)。但是,我收到以下错误:

Traceback(最近一次调用最后一次):文件 “/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 行,在扫描中 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)

但是我看不到如何查询和扫描表...我看不到可用的功能。

【问题讨论】:

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


    【解决方案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], limit=1) 见here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多