CosmosDB 和 Python3:如何查询?

问题描述 投票:0回答:4

我在我的项目中使用 CosmosDB (Azure documentDB),用 Python 3 编写。

我已经找了一段时间了,但我不知道如何查询我的表。我看过一些示例代码,但没有看到如何查询的示例...我所能做的就是获取所有文档(当我的数据库 > 80GB 时并不理想)。

GitHub 存储库显示了一组非常小的数据库和集合操作:https://github.com/Azure/azure-documentdb-python/blob/master/samples/CollectionManagement/Program.py

并且以下SO帖子展示了如何读取所有文档...但没有展示如何执行查询,例如“WHERE = X;”

如果有人能指出我正确的方向,并且可能提供一个示例来展示如何运行查询,我将非常感激。

python python-3.x azure azure-cosmosdb
4个回答
5
投票

根据我的理解,我认为您想知道如何使用Python执行类似SQL的查询来检索DocumentDB API的Azure CosmosDB上的文档,请参考这里的以下代码。

使用 SQL 执行查询

# Query them in SQL
query = { 'query': 'SELECT * FROM server s' }    

options = {} 
options['enableCrossPartitionQuery'] = True
options['maxItemCount'] = 2

result_iterable = client.QueryDocuments(collection['_self'], query, options)
results = list(result_iterable);

print(results)

上面的代码使用的是方法

QueryDocuments

如有任何疑问,请随时告诉我。


更新:与您链接的其他 SO 线程的示例代码结合起来,如下所示。

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']

query = { 'query': 'SELECT * FROM server s' }    
docs = client.QueryDocuments(coll_link, query)
print list(docs)

1
投票
query = 'SELECT * FROM c'
docs = list(client.QueryItems(coll_link,query))

QueryDocuments 已替换为 QueryItems。


0
投票

我最近也遇到了类似的问题。您可以通过调用 fetch_next_block() 来获取块(不是整个查询集)。

query = "select * from c"
options = {'maxItemCount': 1000, 'continuation': True}
q = db_source._client.QueryDocuments(collection_link, query, options)
block1 = q.fetch_next_block()
block2 = q.fetch_next_block()

0
投票

为了从 CosmosDB 读取数据并过滤数据,您可以使用“CosmosDB Python SDK”。您可以使用命令安装它。

pip install azure-cosmos

步骤如下:

  • 创建 Cosmos DB 客户端
  • 使用函数“read_items”读取数据
  • 使用Python脚本过滤数据(示例:
    if item_response['id'] == 2:
from azure.cosmos.aio import CosmosClient as cosmos_client
from azure.cosmos import PartitionKey
import asyncio
import datafile

endpoint = "your URI"
key = "Your Public Key"

database_name = 'your DB name'
container_name = 'your container name'

async def read_items(container, items_to_read):
    for dept in items_to_read:
        item_response = await container.read_item(item=dept['id'], partition_key=dept['name'])
        if item_response['id'] == 2:
              print(f"Id {item_response['id']} Name {item_response['name']} location {item_response['location']} Count {item_response['count']}")

async def run_sample():
    async with cosmos_client(endpoint, credential=key) as client:
        database = await get_or_create_db(client, database_name)
        container = await get_or_create_container(database, container_name)
        dept_items_to_create = [datafile.get_IT(), datafile.get_HR(), datafile.get_Finance()]
        await populate_container_items(container, dept_items_to_create)
        await read_items(container, dept_items_to_create)

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(run_sample())
© www.soinside.com 2019 - 2024. All rights reserved.