我将Azure存储表与python结合使用,并尝试插入一批实体。首次插入实体时,如果表中不存在该实体,则它会快速运行(按预期方式)。第二次插入相同实体时,代码只停留了一分钟,实际上什么也没发生。
这是我的批量插入内容:
acc_name = 'AccountName'
acc_key = 'MyKey'
table_name='MyTable'
service = TableService(account_name=acc_name, account_key=acc_key)
batch = TableBatch()
batch.insert_entity({
'PartitionKey': 'PARTITION1',
'RowKey': "1",
'someKey': 'key'
})
service.commit_batch(table_name, batch)
只需尝试运行此代码两次。第一次可以正常使用,第二次它停留一分钟并返回错误:
Client-Request-ID=a734f002-7dff-11e8-b587-28c63f6cb636 Retry policy did not allow for a retry: Server-Timestamp=Mon, 02 Jul 2018 13:55:29 GMT, Server-Request-ID=4168269a-0002-0073-640c-121de2000000, HTTP status code=202,
Exception=The specified entity already exists.RequestId:4168269a-0002-0073-640c-121de2000000Time:2018-07-02T13:55:30.4994452Z.
我非常确定这不是计划的行为,因为当我在C#中运行等效代码时,它立即引发异常:“索引0中的元素已经存在。”这是有道理的...
我进行的另一项测试是插入实体,而不是批量插入。在这种情况下,当实体已经在表中时,它只会抛出“已经存在”异常。哪个好。
Windows 10,Python 3.6(64位),用于python(版本3.0.0)的azure-sdk。
有人可以确认这种行为吗?该怎么办?
答案 0 :(得分:0)
这是预期的行为。 insert_entity
操作是Insert Entity
REST API操作的包装,REST API操作将创建一个实体(如果该实体不存在),否则将失败,并显示409 (Conflict)
错误。同样,由于批量操作失败,整个批量操作也会失败。
您应该尝试使用Upsert
操作。您可以使用Insert or Replace Entity
或Insert or Merge Entity
。这些操作将确保创建实体(如果不存在)或更新实体(如果存在)。 Python SDK中的相应操作应分别为insert_or_replace_entity
和insert_or_merge_entity
。