我是Boto的新手,我正在尝试使用它将Python词典插入Amazon DynamoDB。我必须遗漏一些东西,因为“dynamizer”(编码器)似乎不支持None值。这是一个问题,因为源数据中有大量的空值。我可以遍历每一行并删除所有值为None的键/值项,但不知何故,我觉得像Boto那样复杂的包应该为我处理。我只是想插入一行,如下所示:
conn = DynamoDBConnection(region=RegionInfo(endpoint="dynamodb.us-west-2.amazonaws.com"))
dest = Table('d_company', connection=conn)
data = {"company_id":99999, "company_name":None}
dest.put_item(data)
...这给了我错误:
Error
Traceback (most recent call last):
File "TestDynamoDB.py", line 37, in testPutIntoDynamoDB
dest.put_item(data)
File "C:\Python27\lib\site-packages\boto\dynamodb2\table.py", line 452, in put_item
return item.save(overwrite=overwrite)
File "C:\Python27\lib\site-packages\boto\dynamodb2\items.py", line 362, in save
final_data = self.prepare_full()
File "C:\Python27\lib\site-packages\boto\dynamodb2\items.py", line 265, in prepare_full
final_data[key] = self._dynamizer.encode(value)
File "C:\Python27\lib\site-packages\boto\dynamodb\types.py", line 228, in encode
dynamodb_type = self._get_dynamodb_type(attr)
File "C:\Python27\lib\site-packages\boto\dynamodb\types.py", line 220, in _get_dynamodb_type
return get_dynamodb_type(attr)
File "C:\Python27\lib\site-packages\boto\dynamodb\types.py", line 110, in get_dynamodb_type
raise TypeError(msg)
TypeError: Unsupported type "<type 'NoneType'>" for value "None"
我做错了什么?
答案 0 :(得分:7)
DynamoDB中的属性值既不是空字符串也不是空字符集。虽然我从经验上发现了这一点,但我在这里看到的最直接的参考是:
http://awsdocs.s3.amazonaws.com/dynamodb/latest/dynamodb-dg.pdf
因此,批准的答案所建议的第二个子弹将不起作用。
接受答案的第三个要点是最好的方法,正如接受的答案所暗示的那样。从设计的角度来看,它更接近于NoSql范例,并且可能提供一些程度的效率,而不是尝试为每种数据类型标识无/ NULL表示并存储它。然后,这个范例在您的逻辑中表现为检查密钥的存在/成员资格(if / then或try / except,具体取决于方案),而不是检查密钥是否为“None / NULL equivalent”值。
如果您真正寻求使用等于NULL / None的值来存储属性,我建议您在应用程序中建立一个唯一/专有值来实现这一点,这比在字符串的情况下更可识别,只是'无'。
(我宁愿简单评论现有的答案,但我作为stackoverflow上的新用户的状态显然阻止我这样做...希望这不是很差的礼仪......)
答案 1 :(得分:4)
你没有做错任何事。虽然boto确实很复杂,但您必须记住,它不了解您的业务逻辑。
例如,至少有一些人可以考虑将None
保存到DynamoDB数据库:
确定它的最佳方法 - 是您的代码。如果您的数据可能是None
,请不要将其添加到字典中。
答案 2 :(得分:1)
更新-2020年5月
AWS更新DynamoDB supports Null and empty objects
根据此更新-
Amazon DynamoDB现在支持DynamoDB表中非键String和Binary属性的空值。空值支持为您提供了更大的灵活性,可以将属性用于更广泛的用例集,而不必在将这些属性发送到DynamoDB之前进行转换。列表,映射和设置数据类型还支持空的字符串和二进制值。
基表的分区键和排序键属性继续要求所有数据类型(包括字符串和二进制)的非空值。同样,本地二级索引或全局二级索引的String和Binary键属性也需要非空值。
要放置null属性,请键入“ NULL”,并将值设置为True。
Python :
AttributeUpdates["MyNull"] = {'Value': {'NULL': True}, 'Action': 'PUT'}
要放置空的String属性,请使用“ S”类型,将值设置为“”。
Python :
AttributeUpdates["MyEmptyString"] = {'Value': {'S': ""}, 'Action': 'PUT'}
这将是有效的dynamoDB put_item有效负载。 更多详细信息-API_PutItem