Azure表:没有空字符串属性(列)?

时间:2014-03-05 04:01:44

标签: python azure

使用python SDK。在我看来,无法将空字符串存储为Azure表中的属性值。

例如(这是针对云,而不是本地):

table_service.create_table('stackoverflow')

person = dict()
person['PartitionKey'] = 'something'
person['RowKey'] = '1'
person['first_name'] = 'John'
person['middle_name'] = ' '
person['last_name'] = 'Smith'

table_service.insert_entity('stackoverflow',person)

myEnt = table_service.get_entity('stackoverflow','something','1')

print "First name is " + myEnt.first_name
print "Middle name is " + myEnt.middle_name

这导致:

# ./test_azure.py 
First name is John
Traceback (most recent call last):
  File "./test_azure.py", line 25, in <module>
    print "Middle name is " + myEnt.middle_name
AttributeError: 'Entity' object has no attribute 'middle_name'

这使得很多丑陋的“if hasattr”代码到处都是。您不能假设从此表中提取的每个实体都具有middle_name属性。这个例子很简单,但想象一下有100个属性。

我试过'','','等等。我也试过没有。这些都不会导致将属性添加到数据库中。

是/否确实有效。

Azure表有什么基础我不理解,因为在我看来我应该能够存储一个空字符串。也许这是违反NoSQL福音来存储null,但是一个空字符串?

1 个答案:

答案 0 :(得分:1)

您的理解是正确的。 Azure表存储中支持空字符串。看起来SDK存在问题。如果您在GitHub查找序列化实体的源代码(查找函数_convert_entity_to_xml,第690行),您会注意到以下内容:

if value == '':
    properties_str += ' m:null="true" />'

上面的代码基本上是检查值是否为空,然后通过将m:null属性设置为true告诉表服务不存储此属性。

如果我使用.Net SDK尝试使用相同的代码,它可以很好地工作(因此有关Python SDK问题的评论)。

您可以做的是提交错误报告,负责管理此问题的团队应该负责处理。除此之外,由于您安装了SDK,您还可以在本地副本上更改代码,以便您的代码处理空字符串。类似的东西:

if value == '':
    if mtype != 'Edm.String':
        properties_str += ' m:null="true" />'

(我真的不用Python编写代码,所以我相信你会找到一种更好的方法:))