Можно ли установить SET для отображения, когда ключ содержит точку? - PullRequest
0 голосов
/ 04 апреля 2020

Мой код проблемы c (минимальный воспроизводимый пример):

import (
    "fmt"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/dynamodb"
    "github.com/aws/aws-sdk-go/service/dynamodb/expression"
)

const (
    tableName = "myTable"
)

var (
    sess = session.Must(session.NewSession())
    dynamodbClient = dynamodb.New(sess)
)

func main() {
    update := expression.Set(
        expression.Name("mymap.vitaly.zdanevich"),
        expression.Value(true),
    )

    expr, _ := expression.NewBuilder().WithUpdate(update).Build()

    updateItemInput := dynamodb.UpdateItemInput{
        TableName: aws.String(tableName),
        Key: map[string]*dynamodb.AttributeValue{
            "pk": {
                S: aws.String("test"),
            },
        },
        UpdateExpression:          expr.Update(),
        ExpressionAttributeNames:  expr.Names(),
        ExpressionAttributeValues: expr.Values(),
    }
    fmt.Printf("%#v\n", updateItemInput)

    dynamodbClient.UpdateItem(&updateItemInput)

}

Результат updateItemInput:

{
  ExpressionAttributeNames: {
    #0: "mymap",
    #1: "vitaly",
    #2: "zdanevich"
  },
  ExpressionAttributeValues: {
    :0: {
      BOOL: true
    }
  },
  Key: {
    pk: {
      S: "test"
    },
    sk: {
      S: "test"
    }
  },
  TableName: "myTable",
  UpdateExpression: "SET #0.#1.#2 = :0\n"
}

Да, я понимаю, что точка предназначена для доступа к значениям внутренней карты, но что лучшая стратегия в таком случае? Мое текущее решение:

expression.Name("mymap."+strings.Replace(username, ".", "_", -1))

1 Ответ

0 голосов
/ 04 апреля 2020

Aws имеет опцию для обработки этого случая с использованием выражений-атрибутов-имен ( Ref ). Но в aws go библиотека Expression Builder создает ExpressionAttributeNames, разделяя Name на точку и третью скобку. Вы можете попробовать без выражения Builder.

    updateItemInput := dynamodb.UpdateItemInput{
        TableName: aws.String(tableName),
        Key: map[string]*dynamodb.AttributeValue{
            "pk": {
                S: aws.String("test"),
            },
        },
        UpdateExpression:          aws.String("SET #0.#1 = :0"),
        ExpressionAttributeNames:  map[string]*string {
            "#0": aws.String("mymap"),
            "#1": aws.String("vitaly.zdanevich"),
          },
        ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
            ":0": {
                BOOL: aws.Bool(true),
            },
        },
    }
    fmt.Printf("%#v\n", updateItemInput)

    dynamodbClient.UpdateItem(&updateItemInput)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...