Как упомянуть атрибут карты / словаря в выражении условия с put_item в Dynamodb - PullRequest
0 голосов
/ 09 января 2020

У меня есть динамо-таблица с Costcenter в виде ключа ha sh, и я хочу добавить новые сведения о команде в отдельный элемент / запись БД, если имя команды не существует.

sample image of db item that shows addition of teams

мой код выполняется в лямбда-выражении.

import json
import boto3


dynamodb_res = boto3.resource('dynamodb', region_name='ap-south-1')
table=dynamodb_res.Table('sampletable')

def lambda_handler(event, context):
    def add_team():
        table.put_item(
        Item={
            'COSTCENTER': event['costcenter'],
            'Teams': {
                 event['teamName']: {
                     "EMAIL": event['email'],
                     "GROUP": event['group']     
                }
            }
        },
        ConditionExpression= "attribute_not_exists(Teams[event['teamName']])"
        )
    add_team()

параметр event['teamname'] содержит информацию о названии команды. Параметры находятся в консоли событий конфигурации лямбда-теста.

Мои параметры :

{
  "teamName": "team1",
  "costcenter": "0000",
  "email": "sample@samplename.com",
  "group": "devops"
}

Команда 'team1' должна быть добавлена, только если ее там нет. Я получаю ошибку ниже после запуска кода.

"errorType": "ClientError",
  "errorMessage": "An error occurred (ValidationException) when calling the PutItem operation: Invalid ConditionExpression: Syntax error; token: \"event\", near: \"[event[\""

1 Ответ

0 голосов
/ 14 января 2020

В ConditionExpression вы можете указать параметры c или так называемые параметры атрибута выражения для замены, например:

  • attribute_not_exists(Teams.team1) (stati c)
  • attribute_not_exists(:team) (атрибут выражения)

В последнем случае вам нужно будет предоставить отдельный ExpressionAttributeValues параметр для вашего вызова boto3.

Здесь выполните c для этого, который упоминается в документации boto3: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html

В вашем случае я бы просто попытался расширить имя параметра, используя f-string:

ConditionExpression=f"attribute_not_exists(Teams.{[event['teamName']})"

...