お疲れ様です。
まだ、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種類があります。
-
query_items
メソッド- SQLライクなクエリを使用して、複数条件でデータを取得する。
-
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を使った方がいいですね。