更新 DynamoDB table 项目的属性

Update attributes of DynamoDB table item

在定义我的 DynamoDB table 时,我选择 filename 作为唯一属性或主键。在这个函数中,我想用特定的 filename 修改条目的某些列。我在遵循另一个 SO 答案后尝试了这个:

def update_item_in_db(filename, archive_path):
    table = dynamodb.Table(dynamodb_table_name)
    try:
        logger.info(f'Updating dynamo table for filename: {filename}')
        response = table.update_item(
            Key={'filename': filename},
            AttributeUpdates={
                'archive_path': archive_path,
                'archived_on': datetime.today().strftime('%Y-%m-%d-%H:%M:%S')
            },
        )
    except Exception as e:
        raise Exception(f"Unable to insert filename into dynamodb: {e}") 
    return response

但我得到一个错误:

Parameter validation failed:\nInvalid type for parameter AttributeUpdates.archive_path, value: archive/100-ff0-uat/1591282803734/issues_1591282803734.zip, type: <class 'str'>, valid types: <class 'dict'>\nInvalid type for parameter AttributeUpdates.archived_on, value: 2021-11-21-15:06:46, type: <class 'str'>, valid types: <class 'dict'>",

那我也试了:

        response = table.update_item(
            {
                'filename': filename,
                'archive_path': archive_path,
                'archived_on': datetime.today().strftime('%Y-%m-%d-%H:%M:%S')
            }
        )

但随后出现以下错误:

 "Unable to insert filename into dynamodb: update_item() only accepts keyword arguments.",

更新项目的正确语法是什么?

请注意,我只想UPDATE/MODIFY而不是删除和重新插入。

第一种方法使用已弃用的语法。第二个更接近你想做的。

像这样的东西应该可以工作:

from datetime import datetime

import boto3

dynamodb = boto3.resource("dynamodb")

def update_item_in_db(filename, archive_path):
    table = dynamodb.Table(dynamodb_table_name)

    table.update_item(
        Key={
            "filename": filename
        },
        UpdateExpression="SET #archive_path = :archive_path, #archived_on = :archived_on",
        ExpressionAttributeNames={
            "#archive_path": "archive_path",
            "#archived_on": "archived_on"
        },
        ExpressionAttributeValues={
            ":archive_path": archive_path,
            ":archived_on": datetime.today().strftime('%Y-%m-%d-%H:%M:%S')
        }
    )

ExpressionAttributeNamesExpressionAttributeValues 允许您在 UpdateExpression 中使用保留关键字,这就是它们常用的原因。

(我没有运行代码,可能有错别字。)