Как получить нулевое значение атрибута таблицы dynamicodb с помощью boto - PullRequest
0 голосов
/ 13 марта 2019

Я имею дело со столом, похожим на этот. Название стола: песочницы

Id               name                        type

 1                xyz                         
 2                xx                          
 3                xxx                         
 4                yyyy                        private

проблема, с которой я сталкиваюсь. 1) я не могу получить значение атрибута type, если оно равно нулю. В основном я хочу установить что-то, если это значение равно нулю. Но сканирование DynamodB просто пропускает его в ответе json.

, приведенный ниже, это скрипт на python, который я написал.

dynamodb_resource = session.resource('dynamodb')
table_sandboxes = dynamodb_resource.Table('sandboxes')
response_sandboxes = table_sandboxes.scan()
def _myfun(box_id)
    for i in response_sandboxes['Items']:
                if box_id == i['id']:
                        if i['type'] == 'private':
                                return 'true'
                        else:
                                return 'false'

        return 1


_myfun(2)

ошибка, которую я получаю:

KeyError: 'type'

Итак, 1) есть ли способ, которым я могу сканировать и получить значение атрибута, даже если оно пустое? 2) если сканирование является правильным способом сделать это? 3) Должен ли я также рассмотреть paginator и разобраться с ним, если размер таблицы больше?

Я новичок в этом, любая помощь будет оценена.

1 Ответ

0 голосов
/ 13 марта 2019

DynamoDB обрабатывает null как фактический тип данных , аналогично числу или строке.В приведенном выше примере атрибут type в элементах с идентификаторами 1, 2 и 3 не равен null, он просто отсутствует.В элементе с идентификатором 4 его тип данных - строка.Наличие элементов с различными атрибутами (отсутствующими или разными у разных элементов) возможно в DynamoDB, поскольку оно не имеет схемы.

Самый простой способ устранить ошибку в вашем коде - это проверить в type, присутствующем вitem:

return True if i.get('type') == 'private' else False

Вы также можете сохранить значение в атрибуте type как тип null (номенклатура здесь сбивает с толку), но тогда вы не можете сохранить значение private вэтот атрибут.Я предполагаю, что это не то, что вы хотите.

Что касается вашего второго вопроса, scan, как вы подозреваете, не лучший способ сделать это.Моделирование данных в DynamoDB - тема отдельная.Документы DynamoDB - отличный способ начать изучение этого вопроса.Если вы хотите получить элементы по их атрибуту type, вы можете создать для этого GSI .

...