Как читать данные из Azure CosmosDB в Python

У меня есть пробная учетная запись в Azure, и я загрузил несколько файлов JSON в CosmosDB. Я создаю программу на Python для просмотра данных, но у меня возникают проблемы с этим. Это код, который у меня есть на данный момент:

import pydocumentdb.documents as documents
import pydocumentdb.document_client as document_client
import pydocumentdb.errors as errors

url = 'https://ronyazrak.documents.azure.com:443/'
key = '' # primary key

# Initialize the Python DocumentDB client
client = document_client.DocumentClient(url, {'masterKey': key})

collection_link = '/dbs/test1/colls/test1'

collection = client.ReadCollection(collection_link)

result_iterable = client.QueryDocuments(collection)

query = { 'query': 'SELECT * FROM server s' }

Я где-то читал, что это будет мой первичный ключ, который я могу найти в своей учетной записи Azure Ключи . Я заполнил строку ключа своим первичным ключом, показанным на изображении, но здесь ключ пуст только в целях конфиденциальности.

Я также где-то читал, что ссылка на коллекцию должна быть '/ dbs / test1 / colls / test1', если мои данные находятся в коллекции 'test1' Подборки.

Мой код получает ошибку в функции client.ReadCollection ().

Это ошибка, у меня есть «pydocumentdb.errors.HTTPFailure: код состояния: 401 {« код »:« Неавторизовано »,« сообщение »:« Токен авторизации ввода не может обслуживать запрос. Убедитесь, что ожидаемая полезная нагрузка построена в соответствии с протоколом, и проверьте используемый ключ. Сервер использовал следующую полезную нагрузку для подписи: 'get \ ncolls \ ndbs / test1 / colls / test1 \ nmon, 29 мая 2017 г. 19:47:28 gmt \ n \ n' \ r \ nActivityId: 03e13e74-8db4-4661-837a- f8d81a2804cc "}"

Что остается делать после исправления этой ошибки? Я хочу получить файлы JSON в виде большого словаря, чтобы я мог просматривать данные.

Я на правильном пути? Я неправильно подхожу к этому? Как я могу прочитать документы, которые есть в моей базе данных? Спасибо.


person Rony Azrak    schedule 29.05.2017    source источник


Ответы (2)


Согласно вашей информации об ошибке, похоже, это вызвано неудачей аутентификации с вашим ключом, как указано ниже в официальном объяснении из здесь.

введите описание изображения здесь

Поэтому, пожалуйста, проверьте свой ключ, но я думаю, что ключевым моментом является неправильное использование pydocumentdb. Эти id из Database, Collection и Document отличаются от своих ссылок. Эти API ReadCollection, QueryDocuments необходимо передать по соответствующей ссылке. Вам необходимо получить все ресурсы в Azure CosmosDB через ссылку ресурса, а не идентификатор ресурса.

Согласно вашему описанию, я думаю, вы хотите перечислить все документы по пути идентификатора коллекции /dbs/test1/colls/test1. В качестве справки вот мой пример кода, как показано ниже.

from pydocumentdb import document_client

uri = 'https://ronyazrak.documents.azure.com:443/'
key = '<your-primary-key>'

client = document_client.DocumentClient(uri, {'masterKey': key})

db_id = 'test1'
db_query = "select * from r where r.id = '{0}'".format(db_id)
db = list(client.QueryDatabases(db_query))[0]
db_link = db['_self']

coll_id = 'test1'
coll_query = "select * from r where r.id = '{0}'".format(coll_id)
coll = list(client.QueryCollections(db_link, coll_query))[0]
coll_link = coll['_self']

docs = client.ReadDocuments(coll_link)
print list(docs)

Подробную информацию о DocumentDB Python SDK можно найти здесь.

person Peter Pan    schedule 30.05.2017
comment
Спасибо! Сработало отлично. - person Rony Azrak; 30.05.2017
comment
К вашему сведению ... этот синтаксис не будет работать в ближайшее время ... ???????????? Пакет pydocumentdb для версий 1.x и 2.x пакета SDK Python для Azure Cosmos DB для SQL API будет удален 20 августа 2020 г. См. Выпуск и пенсионная документация для получения дополнительной информации. Используйте последнюю версию Python SDK с новым именем пакета, azure-cosmos. ???????? - person Patrick; 08.10.2019

Для тех, кто использует azure-cosmos, текущую библиотеку (2019) я открыл doc и предоставил образец в GitHub

Образец

from azure.cosmos import cosmos_client
import json

CONFIG = {
    "ENDPOINT": "ENDPOINT_FROM_YOUR_COSMOS_ACCOUNT",
    "PRIMARYKEY": "KEY_FROM_YOUR_COSMOS_ACCOUNT",
    "DATABASE": "DATABASE_ID",  # Prolly looks more like a name to you
    "CONTAINER": "YOUR_CONTAINER_ID"  # Prolly looks more like a name to you
}

CONTAINER_LINK = f"dbs/{CONFIG['DATABASE']}/colls/{CONFIG['CONTAINER']}"
FEEDOPTIONS = {}
FEEDOPTIONS["enableCrossPartitionQuery"] = True
# There is also a partitionKey Feed Option, but I was unable to figure out how to us it.

QUERY = {
    "query": f"SELECT * from c"
}

# Initialize the Cosmos client
client = cosmos_client.CosmosClient(
    url_connection=CONFIG["ENDPOINT"], auth={"masterKey": CONFIG["PRIMARYKEY"]}
)

# Query for some data
results = client.QueryItems(CONTAINER_LINK, QUERY, FEEDOPTIONS)

# Look at your data
print(list(results))

# You can also use the list as JSON
json.dumps(list(results), indent=4)
person Patrick    schedule 08.10.2019