0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CosmosDBのPythonSDKを使って、データを読み取る方法2種類

Last updated at Posted at 2025-01-09

お疲れ様です。
まだ、PythonのCosmosDBの記事って全然ないですね。

部分更新の記事も書きました。

まずは、CosmosDBと接続

サンプルです。

from azure.cosmos import CosmosClient, exceptions

# Cosmos DB の接続情報
ENDPOINT = "https://<your-account-name>.documents.azure.com:443/"
KEY = "<your-primary-or-secondary-key>"
DATABASE_NAME = "<your-database-name>"
CONTAINER_NAME = "<your-container-name>"

# クライアント作成
client = CosmosClient(ENDPOINT, KEY)

# データベースとコンテナ取得
database = client.get_database_client(DATABASE_NAME)
container = database.get_container_client(CONTAINER_NAME)

CosmosDBで検索する方法

CosmosDBでデータを検索する方法は主に以下の2種類があります。

  1. query_items メソッド
    • SQLライクなクエリを使用して、複数条件でデータを取得する。
  2. read_item メソッド
    • IDとパーティションキーが指定して、1件のドキュメントを効率的に取得する。

query_items メソッド

特徴

  • SQLライクなクエリで検索:
    WHERE句を使用して条件に一致するドキュメントを取得できます。
  • 複数条件の検索が可能:
    パーティションキーが分からない場合でも全パーティションを検索できます。

デメリット

  • 全パーティションをスキャンするため、read_item よりも効率が低い。
  • RUの消費量が増加する可能性がある(データ量やパーティション数に依存)。

使い方

以下は query_items を使用したサンプルコードです。
cは何でもいいですが、なにかテーブル名の代わりになるものが必要っぽいです。

query = "SELECT * FROM c WHERE c.id = @id"
parameters = [{"name": "@id", "value": "my-document-id"}]

items = container.query_items(
    query=query,
    parameters=parameters,
    enable_cross_partition_query=True  # パーティションキーが不明な場合に有効化
)

for item in items:
    print("取得したドキュメント:", item)

read_item メソッド

特徴

  • 単一ドキュメントを直接取得:
    ドキュメントのIDとパーティションキーを指定することで、インデックスを活用した高速な検索が可能です。
  • 効率が高い:
    RU(Request Units)の消費が少なく、1回のリクエストで通常1RU未満です。

メリット

  • パフォーマンスが非常に高い
  • コストが低い(RU消費が最小限)
  • 単一ドキュメントを特定する場合に最適

使い方

以下は read_item を使用したサンプルコードです。


# ドキュメントのIDとパーティションキー
DOCUMENT_ID = "my-document-id"
PARTITION_KEY = "my-partition-key"

try:
    # ドキュメントを取得
    document = container.read_item(item=DOCUMENT_ID, partition_key=PARTITION_KEY)
    print("取得したドキュメント:", document)
except exceptions.CosmosHttpResponseError as e:
    if e.status_code == 404:
        print("ドキュメントが見つかりませんでした。")
    else:
        print("エラーが発生しました:", e)

以上です。
特定1件のデータを取得したい場合は、read_itemを使った方がいいですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?