如何通过Python的boto3在DynamoDB中设置布尔值及数据映射
问题:Python使用boto3客户端操作DynamoDB时,设置布尔值报错如何解决?
我基于AWS官方文档使用boto3客户端对DynamoDB表进行数据创建/更新操作,DynamoDB本身支持字符串、数字、列表、集合及布尔类型,但设置包含布尔值的条目时,出现错误提示“属性值应为字符串”,但我明明设置的是布尔值true/false。我知道Item是Python字典,能设置字符串值但无法设置布尔值,请问正确的请求构造方式是什么?
我的代码如下:
db = boto3.client('dynamodb') try: db.put_item( Item={ "year": year, "title": title, "info": {"plot": plot, "rating": Decimal(str(rating))}, "rating" : 42, "award" : {"BOOL": False} } ) except ClientError as err: logger.error(err)
解决方法
方式1:继续使用boto3客户端(client),遵循DynamoDB低级类型格式
boto3客户端不会自动将Python类型映射为DynamoDB类型,必须显式指定每个属性的DynamoDB类型结构。所有属性值都需要用对应的类型键包裹,常见类型对应关系:
- 字符串:
{"S": "字符串内容"} - 数字:
{"N": "字符串形式的数字"}(数字需转为字符串,因为DynamoDB以字符串存储数字) - 布尔值:
{"BOOL": True/False} - 嵌套对象:
{"M": {内部属性的类型结构}}
修正后的代码:
import boto3 from botocore.exceptions import ClientError import logging from decimal import Decimal logger = logging.getLogger(__name__) db = boto3.client('dynamodb') try: db.put_item( Item={ "year": {"N": str(year)}, "title": {"S": title}, "info": { "M": { "plot": {"S": plot}, "rating": {"N": str(Decimal(str(rating)))} } }, "rating": {"N": "42"}, "award": {"BOOL": False} } ) except ClientError as err: logger.error(err)
方式2:改用boto3资源(resource),直接使用Python原生类型
boto3资源是更高层的封装,会自动将Python原生类型映射为DynamoDB类型,写法更简洁直观:
import boto3 from botocore.exceptions import ClientError import logging from decimal import Decimal logger = logging.getLogger(__name__) dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('你的表名') # 替换为实际的DynamoDB表名 try: table.put_item( Item={ "year": year, "title": title, "info": {"plot": plot, "rating": Decimal(str(rating))}, "rating": 42, "award": False # 直接使用Python布尔值即可 } ) except ClientError as err: logger.error(err)
注意:客户端(client)用的是DynamoDB原生API格式,需要手动处理类型;资源(resource)封装了类型转换逻辑,代码更简洁,推荐日常使用。
内容的提问来源于stack exchange,提问作者haju
相关产品推荐
相关产品推荐

