2017-01-27 85 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你是對的,我更新了我的答案。 –