【问题标题】:Aws appsync: possible to do two putitems in one request with a dynamodb resolver?Aws appsync:可以使用 dynamodb 解析器在一个请求中执行两个 putitem 吗?
【发布时间】:2018-07-22 07:18:10
【问题描述】:

在 aws appsync 中,我想进行一次调用 (start_game(phrase:”foo”)),它将写入两个单独的 dynamodb 表(游戏和转弯)。我确信我可以使用 lambda 解析器来做到这一点,但希望避免额外的复杂性。

有没有办法在一个 dynamodb 突变中做两个 putitem(到两个不同的表)?

【问题讨论】:

    标签: amazon-dynamodb aws-appsync


    【解决方案1】:

    到目前为止,实现这一点的唯一方法是使用 Lambda 解析器。

    话虽如此,我们已经从几个客户那里听到了支持此用例的请求,并将将此作为支持它的 +1!

    【讨论】:

    • 那太好了,谢谢杰夫!我也希望能够插入日期。
    • @MichaelEconomy 现在可以在 AppSync 中使用,请参阅下面的回复。从一个或多个表中读取或删除也是可能的。对于日期,您可以使用 $util.time 助手来执行此操作:docs.aws.amazon.com/appsync/latest/devguide/…
    【解决方案2】:

    现在已通过 Batch Resolver 功能将其添加到 AWS AppSync。您可以在此处查看教程:https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-dynamodb-batch.html

    对于这个特定的问题,您可以使用BatchPutItem 将多个项目写入一个或多个表。您可以通过解析器中的 tables 键来执行此操作。对于一个表,它看起来像这样:

    #set($postsdata = [])
    #foreach($item in ${ctx.args.posts})
        $util.qr($postsdata.add($util.dynamodb.toMapValues($item)))
    #end
    
    {
        "version" : "2018-05-29",
        "operation" : "BatchPutItem",
        "tables" : {
            "Posts": $utils.toJson($postsdata)
        }
    }
    

    对于两个表来说,它看起来很相似:

    ## Convert tempReadings arguments to DynamoDB objects
    #set($tempReadings = [])
    #foreach($reading in ${ctx.args.tempReadings})
        $util.qr($tempReadings.add($util.dynamodb.toMapValues($reading)))
    #end
    
    ## Convert locReadings arguments to DynamoDB objects
    #set($locReadings = [])
    #foreach($reading in ${ctx.args.locReadings})
        $util.qr($locReadings.add($util.dynamodb.toMapValues($reading)))
    #end
    
    {
        "version" : "2018-05-29",
        "operation" : "BatchPutItem",
        "tables" : {
            "locationReadings": $utils.toJson($locReadings),
            "temperatureReadings": $utils.toJson($tempReadings)
        }
    }
    

    【讨论】:

    • 这仅适用于插入吗?我正在尝试使用上面提到的 batchPutItem 更新现有记录,并面临如下所述的一些错误。无法解析值 (/batchUpdateDslVehicleStateMutation):类型不匹配错误,预期类型 LIST。
    • @Desmond 批处理操作仅适用于 Put、Delete 和 Read。不更新。
    • 感谢您的回复。这是否意味着 AppSync 不支持批量更新操作。那么解决这个问题的方法是什么。我是否应该创建另一个 lambda 解析器来更新 dynamodb。
    • @Desmond 不是 AppSync 不支持更新,DynamoDB 不支持批量操作更新。 AppSync 只能支持数据源支持的内容。
    • 是的,你是对的。 DynamoDB BatchWrite 支持批量 OUT(新项目)和删除。我们需要改用更新。为此,我使用了 lambda Resolver,以便它为我们传递的数组写入数据,并将结果数组返回给 appsync。可以作为数组发送回订阅者。
    猜你喜欢
    • 2018-12-15
    • 1970-01-01
    • 2019-12-04
    • 2021-07-18
    • 2019-01-06
    • 2021-04-04
    • 2023-03-08
    • 2016-08-15
    • 2020-05-15
    相关资源
    最近更新 更多