2017-01-27 113 views
3

在我的Python脚本我插入一条记录(项目)为DynamoDB表,但我意识到从AWS响应不包括插在实际的项目:DynamoDB插入(放)项目 - 返回创建的项目?

{'ResponseMetadata': {'HTTPHeaders': {'connection': 'keep-alive', 
    'content-length': '2', 
    'content-type': 'application/x-amz-json-1.0', 
    'date': 'Fri, 27 Jan 2017 23:31:22 GMT', 
    'server': 'Server', 
    'x-amz-crc32': '234324243', 
    'x-amzn-requestid': 'xxxxxxxxxx'}, 
    'HTTPStatusCode': 200, 
    'RequestId': 'xxxxxxxxxx', 
    'RetryAttempts': 0}} 

这是不幸的,因为我有这样的逻辑:

if not user.exists(): 
    user = create_user() 
else: 
    user = get_user() 

user.do_something() 

我宁愿不做另一次往返只是为了得到我刚插入的用户对象。

我当然可以模拟对象,因为在Python中使用boto3user对象只是一个类似字典的东西,但能够使用单个表示很好。此外,它似乎像put_item电话

r = user_table.put_item(Item={'user_id': uid, 'info' : { ... }}) 

应该能够返回put'd项目?或者其他一些端点可以吗?

感谢您的任何见解!

回答

3

您需要在put_item请求上设置属性ReturnValues='ALL_NEW'以将项目返回到响应中。作为记录here

编辑:的文件是错误的,ALL_NEW不接受put_item。由于您将内存中的确切项目作为您传递给put_item的参数,因此您确实不需要将其返回。

+0

虽然我很困惑,但文档明确指出:“ReturnValues参数被多个DynamoDB操作使用;但是,PutItem不会识别除NONE或ALL_OLD以外的任何值。”我知道你说PutItem确实接受'ALL_NEW'。那么文档是否过时了? – guival

+0

其实,我发现了一个[open issue](https://github.com/boto/boto3/issues/1150)。它看起来像'ALL_NEW'毕竟对put_item无效,或者我错过了什么? – guival

+0

@guival你是对的,我更新了我的答案。 –