python 如何使用Alexa Skill的DynamodDB适配器通过Dynamodb嵌套属性迭代和更新1值?

gojuced7  于 2023-09-29  发布在  Python
关注(0)|答案(1)|浏览(88)

我正在使用DynamoDb适配器进行alexa技能。FYI,我对开发非常陌生,所以如果这个问题很愚蠢,我道歉。

from ask_sdk_dynamodb.adapter import DynamoDbAdapter

我在dynamodb中有一个像这样嵌套的持久属性。至少这是我最初保存到属性中的内容。

enqueue_data = {
    "ENQUEUE": [
        {
            "link_enqueue": "http://link1.com",
            "offset_in_milliseconds_enqueue": "numerical value",
            "title": "title 1"
        },
        {
            "link_enqueue": "http://link2.com",
            "offset_in_milliseconds_enqueue": "numerical value",
            "title": "title 2"
        }
    ]
}

但在dynamodb中,格式如下所示。这是它的一部分的快照。

{ "link" : { "S" : "http://link1.com" },{ "ENQUEUE" : { "L" : [ { "M" : { "title_enqueue" : { "S" : "Title 1" }, "link_enqueue" : { "S" : "http://link1.com" }, "offset_in_milliseconds_enqueue" : { "N" : "15645" } } }, { "M" : { "title_enqueue" : { "S" : "title 2" }, "link_enqueue" : { "S" : "http://link2.com" }, "offset_in_milliseconds_enqueue" : { "N" : "52546" } } }

首先,我使用this从属性中获取selected_link变量值,这非常有效。

#selected_link = http://link1.com
selected_link = attr['link']

我有以下代码。我正在尝试迭代我在dynamodb中拥有的东西;
1.查找ENQUEUE键值是否存在
1.如果存在,则迭代link_enqueue值,直到它与selected_link变量匹配
1.如果匹配,则更新不同的键值。
示例:如果selected_link为http://link1.com,则在ENQUEUE中查找http://link1.com,如果是,则将offset_in_milliseconds_enqueue更新为新值

def handle(self, handler_input):
        offset_in_milliseconds = '3232'
        
        #getting the attribute from dynamodb
        attr = handler_input.attributes_manager.persistent_attributes
        
        #getting link value 
        selected_link = attr['link']

        # Check if 'ENQUEUE' key exists in persistent attributes
        if 'ENQUEUE' in attr:
            enqueue_data = attr['ENQUEUE']

            # Check if 'link_enqueue' is present in any item within 'ENQUEUE'
            relevant_items = [item for item in enqueue_data.values() if item.get('link_enqueue') == selected_link]

            if relevant_items:
                relevant_item = relevant_items[0]  
                # Assuming you want the first relevant item
                relevant_item['offset_in_milliseconds_enqueue'] = offset_in_milliseconds
                # Save the updated persistent attributes
                handler_input.attributes_manager.save_persistent_attributes()
                return
            return
        return

理想情况下,新属性应该在offset_in_milliseconds_enqueue中具有新值,因为selected_link匹配link_enqueue。其他一切都应该保持不变。

enqueue_data = {
    "ENQUEUE": [
        {
            "link_enqueue": "http://link1.com",
            "offset_in_milliseconds_enqueue": "new numerical value",
            "title": "title 1"
        },
        {
            "link_enqueue": "http://link2.com",
            "offset_in_milliseconds_enqueue": "numerical value",
            "title": "title 2"
        }
    ]
}
n3ipq98p

n3ipq98p1#

克服DynamoDB-JSON复杂性的最佳方法是反序列化为标准JSON。您可以从内置的Boto 3实用程序轻松完成此操作。
快速阅读这篇博客应该可以让你轻松地处理JSON,并使你的更新逻辑更容易:
https://aws.amazon.com/blogs/database/exploring-amazon-dynamodb-sdk-clients/

相关问题