Использование структуры для обновления значений - PullRequest
0 голосов
/ 05 декабря 2018

Я застрял, когда обновляю пустые строковые значения в структуре для обновления таблицы DynamodB.

В настоящее время у меня есть эта структура

type Client struct {
    ClientID       *string    `json:"client_key,omitempty"`
    Name           *string    `json:"client_name,omitempty"`
    Address        *string    `json:"address,omitempty"`
    Country        *string    `json:"country,omitempty"`
    City           *string    `json:"city,omitempty"`
    State          *string    `json:"state,omitempty"`
    PostCode       *string    `json:"post_code,omitempty"`
    CreatedAt      *time.Time `json:"created_at,omitempty"`
}

И этот код при обновленииitem

keyAttr, err := dynamodbattribute.MarshalMap(key)
if err != nil {
    return nil, err
}
valAttr, err := dynamodbattribute.MarshalMap(attributes)
if err != nil {
    return nil, err
}

keyAttr будет использоваться для поля Key, а valAttr будет использоваться в поле ExpressionAttributeValues.Обратите внимание, что я не включил функцию полного обновления полей для экономии места.Но я сделаю это, если вы попросите об этом.

В настоящее время функция работает нормально, кроме случаев, когда я обновил одно из полей пустой строкой.Например, client.Address = aws.String("").Несмотря на то, что я могу выполнить в Dynamodb преобразование моей пустой строки в null, я не могу найти способ обновить ее из-за тега omitempty.

Мне нужен тег omitempty, чтобы игнорировать всеnil значений.Однако я только что исследовал, что тег omitempty также пропускает пустые строковые значения.В настоящее время я должен создать структуру в своей функции следующим образом.

type client struct {
    Name     *string `json:"client_name"`
    Address  *string `json:"address"`
    Country  *string `json:"country"`
    City     *string `json:"city"`
    State    *string `json:"state"`
    PostCode *string `json:"post_code"`
}

Но я не фанат повторения вещей.Итак, вопрос: есть ли лучший способ сделать это?Как вы, ребята, используете структуры с DynamodB?

РЕДАКТИРОВАТЬ

Судя по комментарию @ Питера, json.Encode() печатает пустую строку, если она не равна нулю.

{"client_key":"test","username":"test","email":"","first_name":"test","last_name":"","phone":"","title":"","email_verified":false,"phone_verified":false,"updated_at":"2018-12-06T14:04:56.2743841+11:00"}

Проблема, кажется, в dynamodbattribute.MarshalMap функция

1 Ответ

0 голосов
/ 06 декабря 2018

После нескольких испытаний я наконец-то понял.Я не проверял это, поэтому я не знаю, глючит он или нет.Но сейчас мне кажется, что это работает.

Итак, я сначала закодировал структуру с json.Marshal, а затем json.Unmarshal с map[string]interface{}.Затем я использую dynamodbattribute.Marshal, чтобы преобразовать его в map[string]*AttributeValue

Вот код:

var temp map[string]interface{}
json.Unmarshal(tempStr, &temp)
valAttr, err := dynamodbattribute.MarshalMap(temp)
if err != nil {
    return nil, err
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...