删除DynamoDB表项触发decimal.Inexact异常,求修复方案
解决DynamoDB删除数据时的decimal.Inexact异常
嘿,我来帮你搞定这个问题!你遇到的decimal.Inexact: [<class 'decimal.Inexact'>, <class 'decimal.Rounded'>]异常,核心原因是直接用浮点数初始化Decimal类型导致的精度问题。
问题根源
浮点数是基于二进制存储的,没法精确表示像44.30912302164986这类十进制小数——当你把浮点数传给Decimal()时,实际传入的是这个浮点数近似后的二进制值,转成Decimal时就会因为精度不匹配触发Inexact和Rounded异常,同时这也会导致你传入的rangekey和DynamoDB表中存储的数值无法精确匹配,进而影响删除操作。
修复方案
用字符串形式的数值来初始化Decimal对象,这样能保证十进制数的精度完全保留,和DynamoDB中存储的数值精确匹配。
修改你的代码如下:
dynamodb = boto3.resource('dynamodb', region_name='***') table = dynamodb.Table('***') propid = 1234 # 用字符串初始化Decimal,避免浮点数精度损失 column_set = Decimal("44.30912302164986") print("Attempting a conditional delete...") try: response = table.delete_item( Key={ 'hashkey': propid, 'rangekey': column_set } # 若有条件表达式,里面的Decimal值也要用字符串初始化 ) print("Delete successful!") except Exception as e: print(f"Error: {e}")
额外提醒
如果你的delete_item中包含条件表达式(比如ConditionExpression),其中涉及的所有Decimal数值,都要采用字符串初始化的方式,避免再次触发同类异常。
内容的提问来源于stack exchange,提问作者Barkz
相关产品推荐
相关产品推荐

