Операция обновления / слияния не может найти сущность в Azure Cosmos DB (Table API) - PullRequest
0 голосов
/ 24 января 2019

Данные:

In [66]: list(a.table_service.query_entities('Watchlists',filter="RowKey eq '106619222' "))[-1]
Out[66]: 
{'PartitionKey': '2019-01-24',
 'RowKey': '106619222',
 'Timestamp': datetime.datetime(2019, 1, 24, 16, 36, 45, 474017, tzinfo=tzutc()),
 'avg_vol': 194.3305,
 'ftw_high': 14.68,
 'sell_price_high': 15.5608,
 'sell_price_low': 13.7992,
 'symbol': 'ACRE',
 'conId': 106619222,
 'date': datetime.datetime(2019, 1, 24, 0, 0, tzinfo=tzutc()),
 'is_breakout': False,
 'order_status': 'N/A',
 'last_price': nan,
 'last_volume': nan,
 'etag': 'W/"datetime\'2019-01-24T16%3A36%3A45.4740173Z\'"'}

In [67]: {k:(v.type,v.value) for k,v in entity.items()}
Out[67]: 
{'PartitionKey': ('Edm.String', '2019-01-24'),
 'RowKey': ('Edm.String', '106619222'),
 'Timestamp': ('Edm.DateTime',
  Timestamp('2019-01-24 16:36:45.474017+0000', tz='UTC')),
 'avg_vol': ('Edm.Double', 194.3305),
 'conId': ('Edm.Int64', 106619222),
 'date': ('Edm.DateTime', Timestamp('2019-01-24 00:00:00+0000', tz='UTC')),
 'ftw_high': ('Edm.Double', 14.68),
 'is_breakout': ('Edm.Boolean', False),
 'last_price': ('Edm.Double', 14.04),
 'last_volume': ('Edm.Double', 302.0),
 'order_status': ('Edm.String', 'N/A'),
 'sell_price_high': ('Edm.Double', 15.5608),
 'sell_price_low': ('Edm.Double', 13.7992),
 'symbol': ('Edm.String', 'ACRE')}

Проблема:

Имею простую таблицу Cosmos DB с использованием Table API, а я использую Python SDK. Успешно вставленная сущность с использованием класса azure.cosmosdb.table.tableservice.TableService и метода insert_or_replace_entity.

Но когда я пытаюсь обновить его (используя merge_entity или update_entity), это выдает мне эту ошибку (очистил форматирование, перефразируя):

AzureMissingResourceHttpError: Not Found
{
    "odata.error": {
        "code": "ResourceNotFound",
        "message": {
            "lang": "en-us",
            "value": "The specified resource does not exist. RequestID: [REDACTED]"
        }
    }
}

Когда я пытался вместо этого использовать insert_or_merge_entity, вместо этого я получаю эту ошибку:

AzureHttpError: Bad Request
{
    "odata.error": {
        "code": "BadRequest",
        "message": {
            "lang": "en-us",
            "value": "Requests originating from scripts cannot reference partition keys other than the one for which client request was submitted."
        }
    }
}

Я предполагаю, что Cosmos DB находит совпадение на основе комбинации PartitionKey и RowKey, но я включаю действительные PK и RK и все еще не могу. У кого-нибудь есть решение?

Гуглил безрезультатно, дважды проверил документы https://docs.microsoft.com/en-us/rest/api/storageservices/update-entity2.

1 Ответ

0 голосов
/ 24 января 2019

разобрался с ответом. Если я изменю PartitionKey с EntityProperty на обычную строку, это работает. Должна быть ошибка, я сообщил на GitHub https://github.com/Azure/azure-cosmos-table-python/issues/35

...