如何用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)} # 转为字符串方便查看具体错误信息
补充说明
- DynamoDB的Schema规则:仅主键(分区键/排序键)需要在创建表时定义,非主键字段可以动态添加任意支持的类型(Map、List、String等),无需提前声明。
- Pydantic模型转换:注意对应版本的转换方法,v2版本推荐用
model_dump(),v1版本用dict(),确保模型能正确转为boto3可识别的原生字典。
内容的提问来源于stack exchange,提问作者jbuddy_13
相关产品推荐
相关产品推荐

