簡體   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