gpt4 book ai didi

python - 在 DynamoDB python boto3 中执行 update_item 时出错

转载 作者:太空宇宙 更新时间:2023-11-04 02:31:41 25 4
gpt4 key购买 nike

我在 DynamoDB 中有一个表,其中包含我的一堆文档。这些文档具有以下字段:computedID(主分区键)、publication_timestamp、displayTitle、displayText、displayUrl、producer 和 tags。

我想在表上执行 update_item,以便仅当任何字段 publication_timestamp、displayTitle、displayText、displayUrl、producer 和 tags 发生更改时,记录才会更新。如果记录是全新的,它将被简单地插入到表中。

问题在于,并非表中所有现有文档或传入文档都具有 displayTitle、displayText、displayUrl 和标签。他们可能会错过其中任意数量的字段。

我尝试了以下方法:

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('project_Incoming_Data')
print("Sending documents to DynamoDB...")

for item in Docs:
try:
response=table.update_item(
Key={"computedID":item["computedID"]},
UpdateExpression="SET publication_timestamp = :time, displayTitle= :title, displayText= :text, producer = :p, tags= :tags, displayUrl= :url, time_to_live= :ttl",
ConditionExpression= "publication_timestamp <> :time OR (attribute_exists(displayTitle) AND displayTitle <> :title) OR (attribute_exists(displayText) AND displayText <> :text) OR producer <> :p OR (attribute_exists(tags) AND tags <> :tags) OR (attribute_exists(displayUrl) AND displayUrl <> :url)",
ExpressionAttributeValues={
":time":item["publication_timestamp"],
":ttl":item["time_to_live"],
":title":item["displayTitle"],
":text":item["displayText"],
":p":item["producer"],
":tags":item["tags"],
":url":item["displayUrl"]
},
ReturnValues="UPDATED_NEW"
)
print("response is: "+str(response))
except Exception as e:
print (e)
print("Done with sending documents to DynamoDB")

我仍然无法将我的一些文档导入 DynamoDB。我得到的错误是“displayText”!我猜测我为确保该字段存在于记录中而采用的机制不适用于没有该字段的文档。

知道如何解决这个问题吗?

最佳答案

我找到了解决方案!问题在于,即使文档可能会遗漏 displayText、displayTitle、tags 或 displayUrl 字段中的任何一个,UpdateExpression、ConditionExpression 和 ExpressionAttributeValues 这三个字段仍然会考虑文档的这些字段。解决方案是根据文档中存在的字段分别为每个文档构造它们。

def send_docs_to_DynamoDB(Docs):
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Compete_Dental_Incoming_Data')
print("Sending documents to DynamoDB...")

for item in Docs:
expression_attribute_values={
":time":item["publication_timestamp"],
":ttl":item["time_to_live"],
":p":item["producer"]
}
update_expression="SET publication_timestamp = :time, producer = :p, time_to_live= if_not_exists(time_to_live, :ttl)"
condition_expression= "publication_timestamp <> :time OR producer <> :p"
try:
if 'displayTitle' in item.keys():
update_expression+=", displayTitle= :title"
expression_attribute_values[":title"]=item["displayTitle"]
condition_expression+=" OR displayTitle <> :title"
if 'displayText' in item.keys():
update_expression+=", displayText= :text"
expression_attribute_values[":text"]=item["displayText"]
condition_expression+=" OR displayText <> :text"
if 'displayUrl' in item.keys():
update_expression+=", displayUrl= :url"
expression_attribute_values[":url"]=item["displayUrl"]
condition_expression+=" OR displayUrl <> :url"
if 'tags' in item.keys():
update_expression+=", tags= :tags"
expression_attribute_values[":tags"]=item["tags"]
condition_expression+=" OR tags <> :tags"

response=table.update_item(
Key={"computedID":item["computedID"]},
UpdateExpression=update_expression,
ConditionExpression= condition_expression,
ExpressionAttributeValues=expression_attribute_values,
ReturnValues="UPDATED_NEW"
)
print("response is: "+str(response))
except Exception as e:
print (e)
print("Done with sending documents to DynamoDB")

关于python - 在 DynamoDB python boto3 中执行 update_item 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49041524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com