Python: в таблицу хранилища Azure не удалось вставить элементы пакета, когда они существуют - PullRequest
0 голосов
/ 02 июля 2018

Я использую таблицу хранения 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-разрядная версия), azure-sdk для python (версия 3.0.0).

Кто-то может подтвердить это поведение? Что делать?

1 Ответ

0 голосов
/ 02 июля 2018

Это ожидаемое поведение. Операция insert_entity является оболочкой над Insert Entity Операция API REST, которая создает объект, если он не существует, в противном случае происходит сбой с ошибкой 409 (Conflict). Опять же, потому что операция в пакетном режиме завершается неудачно, вся пакетная операция не выполняется.

Вы должны попробовать использовать Upsert операций. Вы можете использовать Insert or Replace Entity или Insert or Merge Entity. Эти операции гарантируют, что объект будет создан (если не существует) или обновлен (если существует). Соответствующие операции в Python SDK должны быть insert_or_replace_entity и insert_or_merge_entity соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...