DynamoDB Python のクエリ

Abid Ullah 2023年10月10日
  1. DynamoDB の紹介
  2. Boto3の紹介
  3. Boto3 を使用して DynamoDB にテーブルを作成する
  4. Boto3 を介して DynamoDB のテーブルを削除する
  5. Boto3 を介して DynamoDB のテーブルを一覧表示する
  6. Boto3 を介した DynamoDB のページネーション
  7. Boto3 を介した DynamoDB での並べ替え
  8. Boto3 経由で DynamoDB のアイテムを取得する
  9. Boto3 経由で DynamoDB の項目をスキャン
  10. DynamoDB のグローバル セカンダリ インデックス
  11. Boto3 を使用して DynamoDB テーブルをバックアップする
  12. まとめ
DynamoDB Python のクエリ

この記事では、Python を使用して Amazon DynamoDB にクエリを実行する方法について説明します。 また、Boto3 とは何か、なぜ DynamoDB にクエリを実行する必要があるのかについても説明します。

DynamoDB の紹介

DynamoDB は、組み込みのセキュリティ メカニズム、継続的なバックアップ、メモリ キャッシング、および便利なデータのインポート/エクスポート ツールを提供する NoSQL データベース サービスです。

DynamoDB は、AWS リージョン内の異なるアベイラビリティーゾーン (AZ) 間でデータを自動的にレプリケートし、停止やデータ損失に対するセキュリティを強化します。 DynamoDB では、きめ細かいアクセス制御、保存時の暗号化、ユーザー アクティビティの記録など、多数のセキュリティ機能を利用できます。

Boto3の紹介

Boto3 は、アマゾン ウェブ サービス (AWS) 用に開発された組み込みの Python ライブラリです。 このライブラリは、DynamoDB を含む Amazon のさまざまなサービスのやり取り、作成、構成、管理、および使用に役立ちます。

Boto3 のインストールとインポート

Boto3 ライブラリを Python ワークベンチにインストールするには、次のコマンドを使用します。

pip install boto3

出力:

Boto3 のインストール

コード:

import boto3

これにより、boto3 ライブラリがノートブックにインポートされます。

Boto3 を DynamoDB に接続する

次のコードを使用して、Boto3 を使用して DynamoDB に接続します。

コード:

import boto3

client = boto3.client(
    "dynamodb",
    aws_access_key_id="yyyy",
    aws_secret_access_key="xxxx",
    region_name="us-east-1",
)

Python Boto3 ライブラリ経由でデータベースに接続するには、AWS DynamoDB でデータベースを作成しておく必要があることに注意してください。

Boto3 を使用して DynamoDB にテーブルを作成する

DynamoDB のテーブルは、複数の方法で作成できます。 これには、Amazon CLI、AWS コンソールの使用、または Boto3 の使用が含まれます。

ここでは、前述の手順に従って、既に接続されているデータベースで Boto3 を使用します。 DynamoDB クライアントとテーブル リソースがどのように変化するかを理解することで、ニーズに応じていずれかを使用できます。このテーブル リソースは一部の操作を大幅に簡素化できるからです。

開発者は、boto3.resource('dynamodb') リソースを使用して、DynamoDB テーブルとすべてのコンテンツを作成、更新、および削除できます。 このリソースは、条件式を使用した項目レベルのセキュリティとテーブル レベルのセキュリティをサポートしています。

DynamoDB データへのサーバーレス アクセスには、boto3.resource('dynamodb') リソースを AWS Lambda 関数と組み合わせて使用します。

import boto3

dynamodb = boto3.resource("dynamodb", region_name="us-west-2")

table = dynamodb.create_table(
    TableName="Movies",
    KeySchema=[
        {"AttributeName": "year", "KeyType": "HASH"},  # Partition key
        {"AttributeName": "title", "KeyType": "RANGE"},  # Sort key
    ],
    AttributeDefinitions=[
        {"AttributeName": "id", "AttributeType": "N"},
        {"AttributeName": "createdAt", "AttributeType": "S"},
    ],
    ProvisionedThroughput={"ReadCapacityUnits": 10, "WriteCapacityUnits": 10},
)
print("Table status:", table.table_status)

Boto3 によるテーブルの作成は、アクティブになって表示されるまでに時間がかかります。 再試行する前に少し待つことをお勧めします。または、waiter 関数を使用して、テーブルがアクティブになったことを通知することもできます。

import botocore.session

session = botocore.session.get_session()
dynamodb = session.create_client(
    "dynamodb", region_name="us-east-1"
)  # low-level client

waiter = dynamodb.get_waiter("table_exists")
waiter.wait(TableName="my-table-name")

Boto3 を介して DynamoDB のテーブルを削除する

DynamoDB でテーブルを削除するのは非常に簡単です。 気が変わってデータベースからテーブルを削除したい場合は、次のコード スニペットを入力する必要があります。

import boto3

dynamodb = boto3.resource("dynamodb", region_name="us-east-1")

dynamodb.delete_table(TableName="Movies")

削除しようとしているテーブルは、データベースに同じ名前で既に存在しているか、エラー メッセージ (テーブルが見つかりません) が表示されることに注意してください。

Boto3 を介して DynamoDB のテーブルを一覧表示する

私たちの地域で利用可能なすべてのテーブルのリストを見つけることに関心がある場合は、list() 関数を使用して、地域で利用可能なすべてのテーブルを一覧表示する必要があります。

import boto3

dynamodb = boto3.resource("dynamodb", region_name=region)

tables = list(dynamodb.tables.all())
print(tables)

テーブルの総数が 100 未満であることを確認する必要があります。そうしないと、リストをページ分割する必要があります。

Boto3 を介した DynamoDB のページネーション

1 回の list 呼び出しで、最大 1MB の項目の結果が返されます。 さらにリストを表示するには、2 回目の呼び出しを発行する必要があります。 LastEvaluatedKey が応答オブジェクトに存在する場合、ExclusiveStartKey を使用して別の呼び出しを行い、このテーブルからさらに項目を取得する必要があります。

dynamodb = boto3.resource("dynamodb", region_name=region)

table = dynamodb.Table("my-table")

response = table.query()
data = response["Items"]

# LastEvaluatedKey indicates that there are more results
while "LastEvaluatedKey" in response:
    response = table.query(ExclusiveStartKey=response["LastEvaluatedKey"])
    data.update(response["Items"])

Boto3 を介した DynamoDB での並べ替え

データベース側では、DynamoDB は結果を並べ替える方法を 1つだけ提供します。 テーブルにアイテムがない場合、アイテムを並べ替える機能は、結果を受け取った後にアプリケーション コードで行うことに限定されます。

ただし、次の構文を使用して、ソートキーを使用して DynamoDB の結果を降順または昇順でソートできます。

import boto3

dynamodb = boto3.resource("dynamodb", region_name=region)

table = dynamodb.Table("my-table")

# true = ascending, false = descending
response = table.query(ScanIndexForward=False)
data = response["Items"]

Boto3 経由で DynamoDB のアイテムを取得する

DynamoDB データベースから特定の項目を取得する場合は、GetItem() 関数を使用します。

import boto3

dynamodb = boto3.resource("dynamodb", region_name=region)

table = dynamodb.Table("my-table")

response = table.get_item(Key={primaryKeyName: "ID-1", sortKeyName: "SORT_2"})

Boto3 経由で DynamoDB の項目をスキャン

テーブル内のすべての情報は、スキャンによってアクセスできます。 データは、テーブル内の各項目を読み取った後、scan() メソッドによって返されます。

FilterExpression などの他の選択肢を追加すると、テーブル スキャン操作で返される結果が少なくなり、目的の結果が得られます。

from boto3.dynamodb.conditions import Key, Attr
import boto3

dynamodb = boto3.resource("dynamodb")

table = dynamodb.Table("Employees")

response = table.scan()
response["Items"]

print(response)

# or


dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table("Employees")

response = table.scan(FilterExpression=Attr("Department").eq("IT"))

print("The query returned the following items:")
for item in response["Items"]:
    print(item)

DynamoDB のグローバル セカンダリ インデックス

グローバル セカンダリ インデックスを使用して、メイン テーブルの主キーに含まれていないプロパティをクエリできます。 これを行うことで、全表スキャン手順によってもたらされる遅延と非効率性を回避できます。

グローバル セカンダリ インデックスにもプライマリ テーブルのプロパティが含まれますが、別のプライマリ キーを使用して構造化されるため、クエリが高速になります。

Boto3 を使用して DynamoDB テーブルをバックアップする

Boto3 を使用して DynamoDB テーブルのオンデマンド バックアップを作成するには、create_backup() メソッドを使用して、バックアップ先のテーブル名とテーブル名を渡します。

import boto3

client = boto3.client("dynamodb")

response = client.create_backup(TableName="Employees", BackupName="Employees-Backup-01")
print(response)

まとめ

この記事では、Python Boto3 を使用して DynamoDB テーブルをクエリし、Amazon DynamoDB でその他の CRUD アクティビティを作成、一覧表示、および実行し、その他のメンテナンス タスクを実行する方法について説明しました。

著者: Abid Ullah
Abid Ullah avatar Abid Ullah avatar

My name is Abid Ullah, and I am a software engineer. I love writing articles on programming, and my favorite topics are Python, PHP, JavaScript, and Linux. I tend to provide solutions to people in programming problems through my articles. I believe that I can bring a lot to you with my skills, experience, and qualification in technical writing.

LinkedIn