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

如何用Boto3将Python字典存入DynamoDB非主键属性?是否需M声明?

问题解答

核心结论

  • DynamoDB是无Schema数据库(仅主键需要预定义),不需要在CDK中显式声明非主键字段的类型,默认支持存储Map(对应Python字典)类型。
  • 不想将字典存为字符串的话,不需要选择方案2,问题出在你的API代码写法上,而非表定义。

错误原因分析

你当前代码中使用json.dumps(student)尝试存储Student对象,但student是FastAPI的Pydantic模型实例,直接传入json.dumps会导致序列化异常(Pydantic实例不能直接被JSON序列化),这才是触发错误的核心原因。此外,即便序列化成功,这样存储的是字符串而非Map类型,也不符合你的需求。

最优实现方式

直接将Pydantic模型转换为原生Python字典,作为put_item的Item值传入即可,boto3会自动将Python字典映射为DynamoDB的Map(M)类型存储,无需修改CDK的表定义。

修正后的API代码示例:

@app.post('/create-student/{student_id}')
def create_student(student_id : int, student : Student):
    try:        
        # 将Pydantic模型转为原生字典(Pydantic v2用model_dump(),v1用dict())
        student_dict = student.model_dump()  # 或 student.dict()
        response = db.put_item(Item={
            "id": f"{student_id}",
            "student": student_dict  # 直接传入字典,无需json.dumps
        })
        return {"response message": response}            
    
    except Exception as error: 
        return {"error message": str(error)}  # 转为字符串方便查看具体错误信息

补充说明

  1. DynamoDB的Schema规则:仅主键(分区键/排序键)需要在创建表时定义,非主键字段可以动态添加任意支持的类型(Map、List、String等),无需提前声明。
  2. Pydantic模型转换:注意对应版本的转换方法,v2版本推荐用model_dump(),v1版本用dict(),确保模型能正确转为boto3可识别的原生字典。

内容的提问来源于stack exchange,提问作者jbuddy_13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:06:16