Compartir a través de

通过 Python 开始使用适用于 NoSQL 的 Azure Cosmos DB

本文介绍如何使用 Python SDK 连接到 Azure Cosmos DB for NoSQL。 连接后,对数据库、容器和项执行作。

包 (PyPi) | API 参考 | 库源代码 | 提供反馈

先决条件

设置项目

为 Python 代码创建环境。

使用 虚拟环境 以隔离方式安装 Python 包,而不会影响系统。

在虚拟环境中安装 Azure Cosmos DB for NoSQL Python SDK。

pip install azure-cosmos

创建 Python 应用程序

在你的环境中,创建新的 app.py 文件并添加以下代码:

"""Sample showing how to connect with endpoint and key."""
# <imports>
import json
import os
import sys
import uuid

from azure.core.exceptions import AzureError
from azure.cosmos import CosmosClient, PartitionKey

# </imports>

DATABASE_ID = "cosmicworks"
CONTAINER_ID = "products"
# <client>
ENDPOINT = os.environ["COSMOS_ENDPOINT"]
KEY = os.environ["COSMOS_KEY"]

client = CosmosClient(url=ENDPOINT, credential=KEY)
# </client>


def main():
    """How to CosmosDB and NoSQL samples."""
    try:
        # Create database and partition key.
        database = client.create_database_if_not_exists(id=DATABASE_ID)

        # Create a container.
        partition_key_path = PartitionKey(path="/categoryId")
        container = database.create_container_if_not_exists(
            id=CONTAINER_ID,
            partition_key=partition_key_path,
            offer_throughput=400,
        )

        # Create a new item.
        new_guid = str(uuid.uuid4())
        new_item = {
            "id": new_guid,
            "categoryId": "61dba35b-4f02-45c5-b648-c6badc0cbd79",
            "categoryName": "gear-surf-surfboards",
            "name": "Yamba Surfboard",
            "quantity": 12,
            "sale": False,
        }
        container.create_item(new_item)

        # Query items.
        sql_stmt = "SELECT * FROM products p WHERE p.categoryId = @categoryId"
        category_id = "61dba35b-4f02-45c5-b648-c6badc0cbd79"
        params = [dict(name="@categoryId", value=category_id)]

        items = container.query_items(
            query=sql_stmt,
            parameters=params,
            enable_cross_partition_query=False,
        )

        for item in items:
            print(json.dumps(item, indent=True))

    except AzureError as err:
        sys.exit("Error:" + str(err))


if __name__ == "__main__":
    main()

前面的代码导入本文其余部分使用的模块。

连接到 Azure Cosmos DB for NoSQL

若要连接到 Azure Cosmos DB API for NoSQL,请创建类的 CosmosClient 实例。 此类是针对数据库执行所有操作的起点。

若要使用 Microsoft Entra 连接到 NoSQL 帐户的 API,请使用安全主体。 主体的确切类型取决于托管应用程序代码的位置。 下表是快速参考指南。

应用程序的运行位置 安全主体
本地计算机(开发和测试) 用户标识或服务主体
蔚蓝 托管标识
Azure 外部的服务器或客户端 服务主体

导入 Azure.Identity

azure-identity 包提供在所有 Azure SDK 库之间共享的核心身份验证功能。

azure-identity 包导入环境。

pip install azure-identity

使用默认凭据实现创建 CosmosClient

如果要在本地计算机上进行测试或在具有托管标识支持的 Azure 服务上运行应用程序,请通过创建 DefaultAzureCredential 实例来获取 OAuth 令牌。

app.py 文件中:

  • 获取帐户的终结点,并将其设置为环境变量 COSMOS_ENDPOINT

  • 导入 DefaultAzureCredential 并创建它的实例。

  • 使用终结点和凭据作为参数创建 CosmosClient 类的新实例。

"""Sample showing how to connect with AAD."""
import json
import os
import sys
import uuid

from azure.core.exceptions import AzureError
from azure.cosmos import CosmosClient

# <credential>
from azure.identity import DefaultAzureCredential

ENDPOINT = os.environ["COSMOS_ENDPOINT"]

credential = DefaultAzureCredential()

client = CosmosClient(ENDPOINT, credential)
# </credential>

DATABASE_ID = "cosmicworks"
CONTAINER_ID = "products"


def main():
    """How to CosmosDB and NoSQL samples."""
    try:
        # Get database.
        database = client.get_database_client(DATABASE_ID)

        # Get container.
        container = database.get_container_client(CONTAINER_ID)
        print("Container info: " + str(container.read()))

        # Create a new item.
        new_guid = str(uuid.uuid4())
        new_item = {
            "id": new_guid,
            "categoryId": "61dba35b-4f02-45c5-b648-c6badc0cbd79",
            "categoryName": "gear-surf-surfboards",
            "name": "Yamba Surfboard",
            "quantity": 12,
            "sale": False,
        }
        container.create_item(new_item)

        # Query items.
        sql_stmt = "SELECT * FROM products p WHERE p.categoryId = @categoryId"
        category_id = "61dba35b-4f02-45c5-b648-c6badc0cbd79"
        params = [dict(name="@categoryId", value=category_id)]

        items = container.query_items(
            query=sql_stmt,
            parameters=params,
            enable_cross_partition_query=False,
        )

        for item in items:
            print(json.dumps(item, indent=True))

    except AzureError as err:
        sys.exit("Error:" + str(err))


if __name__ == "__main__":
    main()

重要

有关添加要启用 DefaultAzureCredential的正确角色的详细信息,请参阅 使用 Azure Cosmos DB 帐户的 Microsoft Entra ID 配置基于角色的访问控制。 具体而言,请参阅有关创建角色并将其分配到主体 ID 的部分。

生成应用程序

生成应用程序时,代码主要与四种类型的资源进行交互:

  • API for NoSQL 帐户,它是 Azure Cosmos DB 数据的唯一顶级命名空间。

  • 数据库,它用于组织帐户中的容器。

  • 容器,它包含数据库中的一组单个项。

  • 项,它表示容器中的 JSON 文档。

此图显示了这些资源之间的关系。

Azure Cosmos DB 层次结构图(包括帐户、数据库、容器和项)。

顶部是显示 Azure Cosmos DB 帐户的层次结构示意图。 该帐户包含两个子数据库节点。 其中一个数据库节点包含两个子容器节点。 另一个数据库节点包含单个子容器节点。 该容器节点包含三个子项节点。

一个或多个关联的 Python 类表示资源类型。 此列表显示用于同步编程的最常见类。 (azure.cosmos.aio 命名空间中有类似的异步编程类。)

说明
CosmosClient 此类为 Azure Cosmos DB 服务提供客户端逻辑表示。 客户端对象配置和执行针对服务的请求。
DatabaseProxy 服务中尚不存在的数据库的接口。 不应直接实例化此类。 请改用 CosmosClient get_database_client 方法。
ContainerProxy 与特定 Cosmos DB 容器交互的接口。 不应直接实例化此类。 请改用 DatabaseProxy get_container_client 方法获取现有容器,或改用 create_container 方法创建新容器。

这些指南演示如何使用这些类来生成应用程序。

指南 说明
创建数据库 创建数据库。
创建容器 创建容器。

另请参阅

后续步骤