You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:50:18