[英]Dynamically and conditionally update_item on nested DynamoDB dict
我有一個 DynamoDB 表,其中包含以下格式的項目:
{
"attributes": {
"cities": {
"oakland": {
"data": "Some stuff."
}
},
"people": {
"Joe": {
"data": "Some stuff."
}
}
}
我有一個 JSON 文件 (dynamodbupdate.json),其中包含我想添加的新數據。 結構如下所示:
{
"attributes": {
"cities": {
"oakland": {
"data_point_1": "warm"
}
},
"people": {
"Joe": {
"data_point_1": "tall",
"data_point_1": "smart"
}
}
}
我想使用 boto3 庫中的update_item操作更新表,以將新數據添加到我的表中,而不會覆蓋現有數據。 我可以使用單個表項執行此操作,但我正在嘗試找到一種將新數據動態添加到多個項的方法,以便我的新表如下所示:
{
"attributes": {
"cities": {
"oakland": {
"data": "Some stuff.",
"data_point_1": "warm"
}
},
"people": {
"Joe": {
"data": "Some stuff."
"data_point_1": "tall",
"data_point_2": "smart"
}
}
}
對單個項目執行此操作的 UpdateExpression 如下所示:
UpdateExpression = 'SET people.Joe.data_point_1 = if_not_exists(people.Joe.data_point_1, tall)'
但是,我很想找到一種方法來遍歷 dynamodbupdate.json 文件的全部內容並為所有數據發出 update_item 命令。
這篇文章非常接近我所需要的,但在我的示例中,我無法理解正確的方法。 謝謝你的幫助!
我能夠(大部分)通過執行以下操作來解決這個問題:
def lambda_handler(event, context):
configPath = os.environ['LAMBDA_TASK_ROOT'] + "/dynamodbupdate.json"
configContents = open(configPath).read()
configJson = json.loads(configContents)
ld = configJson.get('attributes').get('cities')
cities_dict = (list(ld))
for x in cities_dict:
all_dp = list(ld.get(x))
for dp in all_dp:
update_query = 'SET #a.#c.#x.#dp = if_not_exists(#a.#c.#x.#dp, :val)'
perform_update = table.update_item(
Key={'primarykey': whateveryourkeyis},
ExpressionAttributeValues={
':val': ld.get(x).get(dp)
},
ExpressionAttributeNames={
'#a': 'attributes',
'#c': 'cities',
'#x': x,
'#dp': dp
},
UpdateExpression=update_query)
我也可以循環遍歷城市/人員級別並提取該數據。 希望這可以幫助某人!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.