Почему DynamoDB добавляет суффикс NULL к именам атрибутов?

Я работал над игрушечным проектом и заметил, что Dynamo добавил суффикс (NULL) к двум именам моих атрибутов. Раньше я этого не замечал, поэтому я предполагаю, что это произошло после одного из моих изменений кода. Я не мог найти никаких упоминаний об этом поведении в Интернете.

суффикс имени нулевого атрибута Dynamodb

Сценарий, который я запускаю, — это простой PutItem полученный из официальной документации Dynamodb, где я вставляю в таблицу несколько фиктивных пользователей.

func InsertModel(m interface{}) error {
    av, err := dynamodbattribute.MarshalMap(m)
    if err != nil {
        return fmt.Errorf("handlers: Got error marshalling map: %v", err)
    }

    input := &dynamodb.PutItemInput{
        Item:                av,
        TableName:           aws.String(appTableName),
        ConditionExpression: aws.String("attribute_not_exists(PK) AND attribute_not_exists(SK)"),
    }

    _, err = svc.PutItem(input)
    if err != nil {
        return fmt.Errorf("handlers: Got error calling PutItem: %v", err)
    }

    return nil
}

m (пользовательские фиктивные данные) имеет все поля типа string:

UserModel{PK: "910cc6d8-b7e2-dfg6-d8d4-sh6d0e3fde6b", SK: "user_info", Name: "bla", ImageURI: "aaa"},

Когда я удаляю поля «Имя» и «ImageURI», PutItem вставляет логическое значение true в значение поля, как показано ниже.

dynamodb логическое значение атрибута, если его нет в putitem

Вот значение в av после операции MarshalMap.

  1. с заполненными полями «Имя» и «ImageURI»:
map[ImageURI:{
  S: "aaa"
} Name:{
  S: "bla"
} PK:{
  S: "910cc6d8-b7e2-dfg6-d8d4-sh6d0e3fde6b"
} SK:{
  S: "user_info"
}]
  1. а здесь без "Name" и "ImageURI" как в UserModel{PK: "910cc6d8-b7e2-dfg6-d8d4-sh6d0e3fde6b", SK: "user_info"}
map[ImageURI:{
  NULL: true
} Name:{
  NULL: true
} PK:{
  S: "910cc6d8-b7e2-dfg6-d8d4-sh6d0e3fde6b"
} SK:{
  S: "user_info"
}]

Я попытался удалить все записи из таблицы и снова вставить, но поведение продолжается. Кроме того, я проделал тот же процесс для атрибута типа int (вставив объект с заполненным и не заполненным атрибутом int), и я получаю 0, когда он не заполнен (чего я и ожидал). Я попытался воспроизвести это с другим атрибутом строкового типа и получил такое же поведение (истинно, когда пусто), но имя атрибута не имеет суффикса NULL.

Таким образом, кажется, что это поведение в основном происходит с типом string в моем случае, и я получаю только суффикс NULL в атрибутах «Имя» и «ImageURI», но не в другом строковом атрибуте, который я пробовал (ни инт один).


person Thiago Balbo    schedule 03.01.2020    source источник


Ответы (2)


У меня была такая же проблема с одним из полей элементов таблицы.
Для этого поля я выполнял обновление с помощью параметра NameMap, полезного, когда вы хотите использовать имя, которое по каким-то другим причинам зарезервировано Dynamo. . Я просто попытался не использовать опцию NameMap, дав другое имя для своего поля, и этот суффикс исчез. Надеюсь, мой опыт может быть чем-то полезен. С Уважением

person Marco    schedule 08.05.2020

Вариант А

Метод dynamodbattribute.MarshalMap считывает теги структуры json, если они есть. Добавив omitempty, атрибут будет отключен от элемента. Затем, когда вы читаете его позже, по умолчанию будет пустое значение в структуре.

type Foo struct {
    Bar string `json:"bar,omitempty"`
}

Вариант Б

Вы можете явно установить пустые значения структуры, либо создав свой собственный dynamodb.AttributeValue, либо реализовав интерфейс marshaller в своей структуре. Например:

item := map[string]*dynamodb.AttributeValue{
  "Foo": {
    S: aws.String("")
  }
}

Удаление суффикса (NULL)

После удаления всех строк, содержащих значение NULL в столбце с суффиксом (NULL), требуется некоторое время, чтобы этот суффикс исчез из пользовательского интерфейса AWS. Когда я тестировал это, это заняло примерно 12 часов.

Обсуждение

Продолжите обсуждение нулевого поведения на github.

person Josh Hibschman    schedule 07.01.2021