簡體   English   中英

無法使用 boto3 從 DynamoDB StringSet 中刪除項目

[英]Unable to delete item from DynamoDB StringSet with boto3

我有一個包含 StringSet 類型屬性的表。 屬性名稱是allDevices 我正在嘗試從 StringSet 中刪除設備 ID。 但是,當我運行以下代碼時,它不會從 StringSet 中刪除字符串。 它也不會拋出任何錯誤。 當嘗試刪除 deviceID fakeID1響應是:

 {'Attributes': {'allDevices': {'fakeID1', 'fakeID2'}}, 'ResponseMetadata': {'RequestId': '<removed>', 'HTTPStatusCode': 200, 'HTTPHeaders': {'server': 'Server', 'date': 'Fri, 22 Feb 2019 09:04:52 GMT', 'content-type': 'application/x-amz-json-1.0', 'content-length': '93', 'connection': 'keep-alive', 'x-amzn-requestid': '<removed>', 'x-amz-crc32': '<removed>'}, 'RetryAttempts': 0}}

如何讓 DynamoDB 從 StringSet 中刪除字符串?

蟒蛇代碼:

 dynamodb = boto3.resource('dynamodb', region_name='us-east-1') table = dynamodb.Table('sniffer-users') try: response = table.update_item( Key={ 'username': user, }, UpdateExpression="DELETE allDevices :s", ExpressionAttributeValues={ ':s': set(deviceID), }, ReturnValues="UPDATED_NEW" ) print(response) except ClientError as e: print(e.response['Error']['Message']) return -9

我嘗試過的事情:

  • 從 deviceID 周圍刪除set()
  • 更改DELETEREMOVE
  • 頭撞牆,乞求懇求
  • 顯式設置fakeID1使其讀取':s': set('fakeID1'),
  • 使用語法':s': {'SS': [oldDeviceID]},
  • 四重檢查allDevices的代碼與 DDB 上的相同
  • allDevices添加一些東西 - 這完美無缺
  • 將運行時從 Python 3.7 更改為 Python 2.7

您只需要對您的 ExpressionAttributeValues 稍作修改。 要將單個字符串轉換為集合,您必須首先將其設為列表。

ExpressionAttributeValues={
    ':s': set([deviceID]),
}

請注意以下將變量放入 [] 以使其列出與不這樣做之間的區別。

>>> deviceID = "WB529"
>>> set(deviceID)
set(['9', '2', 'B', '5', 'W'])
>>> set([deviceID])
set(['WB529'])

即使沒有進行任何更改,此刪除操作也將表明它成功並返回“已更新”屬性。 我有一些非常相似的代碼; 從響應中無法判斷您是否從字符串集中刪除了一個元素,或者它是否從一開始就不存在。

我還沒有嘗試過,但我相信添加 ConditionExpression 會給你反饋(操作要么成功,要么拋出異常)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM