python - Python:Azure 存储表在存在时无法插入批处理项
问题描述
我使用带有 python 的 Azure 存储表并尝试插入一批实体。第一次插入实体时,当它在表上不存在时,它工作得很快(如预期的那样)。在第二次插入相同的实体时,代码只是卡住了一分钟,并没有真正发生任何事情。
编码
这是我的批量插入:
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.
测试#1
我很确定这不是计划的行为,因为当我在 C# 中运行等效代码时,它会立即抛出异常:“索引 0 中的元素已经存在。”。这是有道理的...
测试#2
我做的另一个测试是插入一个实体,而不是批量插入。在这种情况下,当实体已经在表中时,它只是抛出“已经存在”异常。哪个好。
我的环境
Windows 10、Python 3.6(64 位)、用于 python 的 azure-sdk(版本 3.0.0)。
有人可以确认这种行为吗?该怎么办?
解决方案
这是预期的行为。insert_entity
operation 是 REST API 操作的包装器,Insert Entity
如果实体不存在则创建实体,否则会失败并409 (Conflict)
出现错误。再次因为批处理操作失败,整个批处理操作失败。
您应该尝试使用Upsert
操作。您可以使用Insert or Replace Entity
或Insert or Merge Entity
。这些操作将确保创建(如果不存在)或更新(如果存在)实体。Python SDK 中对应的操作应该是insert_or_replace_entity
和insert_or_merge_entity
分别。
推荐阅读
- type-conversion - MIPS 中有没有办法从用户那里读取可以是整数或字符的输入?
- c# - .NET 敏感数据暴露漏洞修复
- php - 使用 Dokan 插件时按供应商对 WooCommerce 购物车商品进行排序
- regex - 无需 6 个助手即可将输入替换为另一个
- python - 在 Pandas 数据框列中查找分类数据中特征的数量
- amazon-web-services - 在 DynamoDB 中,如果全局二级索引发生冲突会发生什么?
- javascript - Expo Splash 图像在构建时会降低质量
- c# - Swashbuckle.AspNetCore.Cli 不适用于 appsettings.json
- c# - Azure 从连接的设备/DPS 服务获取 IoTHub 连接字符串
- assembly - Bochs Emulator -> 从软盘启动时闪烁?