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

0 投票
1 回答
691 浏览
提问于 2025-04-17 20:53

在使用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'

这导致到处都是难看的“如果有这个属性”代码。你不能指望从这个表中提取的每个实体都有一个中间名属性。这个例子很简单,但想象一下如果有100个属性会怎样。

我试过了空字符串‘’,空格‘ ’,还有一些空格‘ ’等等。我也试过None。结果这些都没有让属性被添加到数据库中。

但是True和False是可以的。

我是不是对Azure表有什么基本的理解错误?因为我觉得我应该能存储一个空字符串。也许存储一个空值是违反了NoSQL的原则,但空字符串呢?

1 个回答

1

你的理解是正确的。空字符串在Azure表存储中是可以使用的。不过,看起来SDK有点问题。如果你查看这个链接上的源代码,看看如何把一个实体转成XML格式,地址是GitHub(找找_convert_entity_to_xml这个函数,大约在690行),你会发现以下内容:

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

简单来说,上面的代码是在检查值是否为空,如果是空的,就告诉表服务不要存储这个属性,通过把m:null属性设置为true来实现。

如果我用.Net SDK试试和你一样的代码,它运行得很好(所以才会提到Python SDK有问题)。

你可以做的是提交一个bug报告,负责这个的团队会处理这个问题。除此之外,既然你已经安装了SDK,你也可以在你本地的代码上做一些修改,让你的代码能够处理空字符串。像这样:

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

(我其实不太会用Python,所以你肯定能找到更好的方法来实现这个 :))

撰写回答