我在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帐户Keys中可以找到的主键。我已经用图像中显示的主键填充了密钥字符串,但是为了隐私目的,密钥在这里是空的。
如果我的数据在集合'test1'Collections中,我也会在某处读到collection_link应为'/ dbs / test1 / colls / test1'。
我的代码在函数client.ReadCollection()。
中出错这是我的错误“pydocumentdb.errors.HTTPFailure:状态代码:401 {“code”:“Unauthorized”,“message”:“输入授权令牌无法提供请求。请检查是否按照协议构建了预期的有效负载,并检查正在使用的密钥。服务器使用了以下有效负载签名:'get \ ncolls \ ndbs / test1 / colls / test1 \ nmon,29 May 2017 19:47:28 gmt \ n \ n'\ r \ nActivityId:03e13e74-8db4-4661-837a-f8d81a2804cc“}”< / p>
修复此错误后,还有什么可做的?我想将JSON文件作为一个大字典,以便我可以查看数据。
我是在正确的道路上吗?我是以错误的方式接近这个吗?如何阅读数据库中的文档?感谢。
答案 0 :(得分:5)
根据您的错误信息,它似乎是由您的密钥验证失败引起的,因为下面的here说明了正式解释。
所以请检查您的密钥,但我认为关键点是错误地使用pydocumentdb
。这些id
Database
,Collection
&amp; Document
与其链接不同。这些API ReadCollection
,QueryDocuments
需要通过相关链接。您需要通过资源链接检索Azure CosmosDB中的所有资源,而不是资源ID。
根据您的描述,我想您要列出集合ID路径/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)
请参阅here中的DocumentDB Python SDK的详细信息。
答案 1 :(得分:1)
对于那些使用azure-cosmos的用户,我在当前的库(2019年)中打开了doc bug and provided a sample in 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)