【问题标题】:Putting/Updating item in DynamoDB fails for the UpdateExpression syntax对于 UpdateExpression 语法,在 DynamoDB 中放置/更新项目失败
【发布时间】:2016-08-26 16:23:47
【问题描述】:

我创建了一个 DynamoDB 表,在我的 Python 代码中,我将资源初始化如下:

self.dynamodb = self.session.resource('dynamodb').Table('aws-ci')

该表只有一个索引/键,名称为environment。我正在尝试将PUT 放入其中,对象如下:

{
  "environment": "beta",
  "X": {
    "current_sha": "sha1",
    "deployed": true,
    "prev_sha": "sha2",
    "status": "inactive"
  },
  "Y-Z": {
    "current_sha": "sha1",
    "deployed": false,
    "prev_sha": "sha2",
    "status": "active"
  }
}

其中,XY-Z 是微服务的名称。我的插入代码如下:

def put_service_data(self, environment, service_name, service_data, status = None):
    get_previous = self.dynamodb.get_item(
        Key = {
            'environment': environment
        }
    ).get(service_name)
    service_data['prev'] = get_previous and get_previous.get('current_sha') or 'NULL'
    if status == 'rollback' and get_previous:
        service_data['current'] = get_previous.get('current_sha')
        service_data['prev'] = get_previous.get('prev_sha')
    set_query = "SET {0}.current_sha = :current, {0}.prev_sha = :prev, {0}.deployed = :is_deployed, {0}.current_status = :status".format(service_name)
    updated = self.dynamodb.update_item(
        Key = {
            'environment': environment
        },
        UpdateExpression = set_query,
        ExpressionAttributeValues = {
            ':current': service_data.get('current'),
            ':prev': service_data.get('prev'),
            ':status': service_data.get('status'),
            ':is_deployed': service_data.get('deployed')
        },
        ReturnValues = "ALL_NEW"
    )
    return updated

以前,我使用{0}.status 而不是{0}.current_status,但这引发了以下错误:

调用 UpdateItem 操作:无效UpdateExpression:属性名称为 保留关键字;保留关键字:status

不管怎样,我把那个属性名改成current_status,然后再次尝试插入,只是这次我收到了:

调用 UpdateItem操作:更新中提供的文档路径 表达式对更新无效

在尝试为服务 X 设置属性时,以及在尝试为 Y-Z 设置属性时:

调用 UpdateItem 操作:无效UpdateExpression:语法错误; 令牌:“-”,附近:“Y-Z”

我目前无法理解 update_item 调用应该如何工作。

【问题讨论】:

    标签: python amazon-web-services amazon-dynamodb boto boto3


    【解决方案1】:

    你试过吗? http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ExpressionPlaceholders.html#ExpressionAttributeNames

    set_query = "SET #service_name.current_sha = :current, #service_name.prev_sha = :prev, #service_name.deployed = :is_deployed, #service_name.current_status = :current_status"
    updated = self.dynamodb.update_item(
        Key = {
            'environment': environment
        },
        UpdateExpression = set_query,
        ExpressionAttributeValues = {
            ':current': service_data.get('current'),
            ':prev': service_data.get('prev'),
            ':current_status': service_data.get('status'),
            ':is_deployed': service_data.get('deployed')
        },
        ExpressionAttributeNames = {
             '#service_name': service_name,
        },
        ReturnValues = "ALL_NEW"
    )
    

    【讨论】:

    • 是的,就是这样。 :/ 我不知道我是怎么错过文档中的那个参数的。
    • 如果我将current_status 改回status 会起作用吗?
    • 如果这样做,则需要将状态添加到 ExpressionAttributeNames
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多