Python:Azure 存储表无法插入批处理项(当它们存在时)

标签 python azure azure-storage azure-table-storage

我将 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.

测试#1

我非常确定这不是计划中的行为,因为当我在 C# 中运行等效代码时,它会立即抛出异常:“索引 0 中的元素已存在。”。这是有道理的...

测试 #2

我做的另一个测试是插入一个实体,而不是批量插入。在这种情况下,当实体已经在表中时,它只是抛出“已存在”异常。这很好。

我的环境

Windows 10、Python 3.6(64 位)、适用于 python 的 azure-sdk(版本 3.0.0)。

有人可以证实这种行为吗?该怎么办?

最佳答案

这是预期的行为。 insert_entity 操作是 Insert Entity 的包装器如果实体不存在,则创建实体的 REST API 操作将失败,并出现 409(冲突) 错误。再次因为批量操作失败,整个批量操作失败。

您应该尝试使用Upsert操作。您可以使用 Insert or Replace EntityInsert or Merge Entity 。这些操作将确保实体被创建(如果不存在)或更新(如果存在)。 Python SDK 中对应的操作应分别为 insert_or_replace_entityinsert_or_merge_entity

关于Python:Azure 存储表无法插入批处理项(当它们存在时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51138152/

相关文章:

python - 调整打印函数格式以跳过缺失值

node.js - 如何在Azure中使用Node JS功能上传文件

Azure Data Lake Storage Gen2 访问 token 生成 - “AADSTS65001 : The user or administrator has not consented to use the application with ID

azure - 如何将两个部署部署到生产环境中,而没有部署到临时环境中?

azure - 如何在 Azure 存储上存储的视频中进行搜索

python - Python中类方法中调用实例方法

python - 幻方 python

尝试挂载 blob 存储时出现容器错误的 azure webapp

azure - 尝试更新 Azure 表存储时出现 "One of the request inputs not valid"错误

python - 单元格运行时更改 ipython 中的输出