如何用Python向DynamoDB表插入数据?遇pickle线程锁错误求助
解决DynamoDB插入时的"cannot pickle '_thread.lock' object"错误
错误原因
你的代码里put_item方法的TableName参数传错了值:你传入的是boto3的Table对象(table = database.Table("Email_Service")),而该参数需要的是字符串类型的表名。当尝试序列化这个Table对象时,因为它包含线程锁(_thread.lock)这类不可pickle的对象,所以抛出了错误。
修复步骤
直接修改put_item的调用代码,有两种可选方式:
方式1:移除冗余的TableName参数
因为你已经通过database.Table("Email_Service")获取了表实例,调用put_item时无需再指定表名:
table.put_item( Item=message )
方式2:将TableName参数改为字符串表名
如果你坚持要指定TableName,传入字符串而非Table对象:
table.put_item( TableName="Email_Service", Item=message )
额外检查点
- 确认
receive_from_queue()返回的message确实是符合DynamoDB要求的字典格式(和你提供的示例结构一致),没有包含任何不可序列化的对象(比如线程、连接实例等)。 - 确保
SORT_KEY和PARTITION_KEY是已定义的字符串常量,对应表的实际分区键和排序键名称。
内容的提问来源于stack exchange,提问作者Tyche
相关产品推荐
相关产品推荐

