更新 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')
}
)
ExpressionAttributeNames
和 ExpressionAttributeValues
允许您在 UpdateExpression
中使用保留关键字,这就是它们常用的原因。
(我没有运行代码,可能有错别字。)
在定义我的 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')
}
)
ExpressionAttributeNames
和 ExpressionAttributeValues
允许您在 UpdateExpression
中使用保留关键字,这就是它们常用的原因。
(我没有运行代码,可能有错别字。)