Search code examples
postgresqlgraphqlaws-appsyncaws-aurora-serverless

Update only the given column value with appsync api and datasource as posgresql


I have created appsync api with postgresql as datasource. Now it's very straight to create , update and delete any record with graphql. But i want something like, whenever any update takes places , i can update value of that particular column only. Eg lets we have user table with 3 fields:

user_id
name
city

now when we update city for user than only city should update:

mutation update{ updateUser(input:{user_id:"xxxxx",city:"xyz"}){ user_id name city }}

user update input:

input updateUserInput{
user_id!
name
city

}

Is there any way to do this in vtx template or we have to use lambda as datasource and then do this.


Solution

  • I figured it out how we can achieve it:
    you can do like this:

    #set ($updates = "")
    #foreach( $item in $ctx.args.input.keySet())
        #if($item)
            #set ($updates = "$updates, $item = '$ctx.args.input.get($item)'")
        #end
    #end
    --------used cognito as authentication , so user id will come in indentity
    #set($user_id = ($ctx.identity.username))  
    #set($updates = "$updates, updated_at = '$util.time.nowFormatted('yyyy-MM-dd HH:mm:ssZ')'")
    {
    "version": "2018-05-29",
    "statements": [
        $util.toJson("update public.tableName SET $updates.substring(1)  WHERE user_id = '$user_id'"),
        $util.toJson("select * from public.tableName WHERE user_id = '$user_id'")
    ]
    }
    

    I hope it will help someone.