繁体   English   中英

DynamoDB 条件 Put_Item

[英]DynamoDB Conditional Put_Item

您好 Stackoverflow 我正在尝试有条件地将一个项目放入 DynamoDB 表中。 DynamoDB 表具有以下属性。

  • ticker - 分区键
  • price_date - 排序键
  • 价格 - 属性

每分钟我都会打电话给 API,它会为我提供到目前为止当天所有股票价格的一分钟一分钟的字典列表。 但是,我从 API 收到的数据有时会滞后一两分钟。 我并不是特别想在每次获取新数据时都覆盖 DynamoDB 表中的所有记录。 为了实现这一点,我尝试创建一个条件表达式,仅在ticker匹配但有新的 price_date 时才使用price_date

我在下面创建了我的代码的简化,以更好地说明我的问题。

import boto3
from boto3.dynamodb.conditions import Attr

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('stock-intraday')

data = [
    {'ticker': 'GOOG', 'price_date': '2021-10-08T9:30:00.000Z', 'price': 100},
    {'ticker': 'GOOG', 'price_date': '2021-10-08T9:31:00.000Z', 'price': 101}
]

for item in data:
    dynamodb_response = table.put_item(Item=item,
                                       ConditionExpression=Attr("ticker").exists() & Attr("price_date").not_exists())

但是,当我运行此代码时,出现此错误...

在此处输入图像描述

我的条件表达式有什么问题?

找到了我自己问题的答案。 DynamoDB 抛出错误,因为我的代码可以正常工作,但有一些小改动。

需要有一个 TRY EXCEPT 块,而且由于已经评估了分区键,因此只需要将 price_date 包含在条件表达式中

import boto3
from boto3.dynamodb.conditions import Attr
from botocore.exceptions import ClientError

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('stock-intraday')

data = [
{'ticker': 'GOOG', 'price_date': '2021-10-08T9:30:00.000Z', 'price': 100},
{'ticker': 'GOOG', 'price_date': '2021-10-08T9:31:00.000Z', 'price': 101}]

for item in data:
    try:
        dynamodb_response = table.put_item(Item=item,
                                       ConditionExpression=Attr("price_date").not_exists())
    except ClientError as e:
        if e.response['Error']['Code'] == 'ConditionalCheckFailedException':
            pass

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM