

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Python アプリケーションを使用して Amazon DynamoDB の PynamoDB モデルと CRUD 関数を自動的に生成する
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application"></a>

*Vijit Vashishtha、Dheeraj Alimchandani、Dhananjay Karanjkar (Amazon Web Services)*

## 概要
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-summary"></a>

Amazon DynamoDB データベースオペレーションを効率的に実行するために、エンティティと作成、読み取り、更新、削除 (CRUD) オペレーション関数を要求するのが一般的です。PynamoDB は Python 3 をサポートする Python ベースのインターフェイスです。また、Amazon DynamoDB Transactions のサポート、属性値の自動シリアル化と逆シリアル化、Flask や Django などの一般的な Python フレームワークとの互換性などの機能も提供します。このパターンは、PynamoDB モデルと CRUD オペレーション関数の自動作成を合理化するライブラリを提供するため、Python と DynamoDB を使用する開発者に役立ちます。データベーステーブルに不可欠な CRUD 関数を生成する一方で、Amazon DynamoDB テーブルから PynamoDB モデルと CRUD 関数をリバースエンジニアリングすることもできます。このパターンは、Python ベースのアプリケーションを使用してデータベースオペレーションを簡素化するように設計されています。

このソリューションの主要な機能は次のとおりです。
+ **JSON スキーマから PynamoDB モデル** – JSON スキーマファイルをインポートして Python で PynamoDB モデルを自動的に生成します。
+ **CRUD 関数の生成** – DynamoDB テーブルで CRUD オペレーションを実行する関数を自動的に生成します。
+ **DynamoDB からのリバースエンジニアリング** – PynamoDB オブジェクトリレーショナルマッピング (ORM) を使用して、既存の Amazon DynamoDB テーブルの PynamoDB モデルと CRUD 関数をリバースエンジニアリングします。

## 前提条件と制限
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-prereqs"></a>

**前提条件**
+ アクティブな AWS アカウント
+ Python バージョン 3.8 以降が[ダウンロード](https://www.python.org/downloads/)およびインストールされている
+ Jinja2 バージョン 3.1.2 以降が[ダウンロード](https://pypi.org/project/Jinja2/#files)およびインストールされている
+ ORM を生成する Amazon DynamoDB テーブル
+ AWS Command Line Interface (AWS CLI)、[インストール](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)および[設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)済み
+ PynamoDB バージョン 5.4.1 以降が[インストール済み](https://pynamodb.readthedocs.io/en/stable/tutorial.html#installation)

## アーキテクチャ
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-architecture"></a>

**ターゲットテクノロジースタック**
+ JSON スクリプト
+ Python アプリケーション
+ PynamoDB モデル
+ Amazon DynamoDB データベースインスタンス

**ターゲットアーキテクチャ**

![\[Python アプリを使用して、DynamoDB テーブルから CRUD 関数と PynamoDB モデルを生成します。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/74cc4c73-5c8b-448d-98fb-b681cfa5f860/images/c2c367d6-d88a-4f49-8571-89160539eb08.png)


1. 入力 JSON スキーマファイルを作成します。この JSON スキーマファイルは、PynamoDB モデルの作成元および CRUD 関数の作成先となるそれぞれの DynamoDB テーブルの属性を表します。これには、次の 3 つの重要なキーが含まれています。
   + `name` – ターゲット DynamoDB テーブルの名前。
   + `region` – テーブル AWS リージョン がホストされている 。
   + `attributes` – [パーティションキー](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey) (*ハッシュ属性*とも呼ばれます)、[ソートキー](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey)、[ローカルセカンダリインデックス](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LSI.html)、[グローバルセカンダリインデックス](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html)、[非キー属性](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.TablesItemsAttributes)など、ターゲットテーブルの一部である属性。このツールは、アプリケーションがターゲットテーブルから直接キー属性を取得するため、入力スキーマが非キー属性のみを提供することを想定しています。JSON スキーマファイルで属性を指定する方法の例については、このパターンの「[追加情報](#automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-additional)」セクションを参照してください。

1. Python アプリケーションを実行し、JSON スキーマファイルを入力として指定します。

1. Python アプリケーションは、JSON スキーマファイルを読み取ります。

1. Python アプリケーションは、DynamoDB テーブルに接続し、スキーマとデータ型を取得します。アプリケーションは [describe\$1table](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb/client/describe_table.html) オペレーションを実行して、テーブルのキー属性とインデックス属性を取得します。

1. Python アプリケーションは、JSON スキーマファイルと DynamoDB テーブルの属性を組み合わせます。Jinja テンプレートエンジンを使用し、PynamoDB モデルと対応する CRUD 関数を生成します。

1. PynamoDB モデルにアクセスし、DynamoDB テーブルで CRUD オペレーションを実行します。

## ツール
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-tools"></a>

**AWS のサービス**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) は、フルマネージド NoSQL データベースサービスです。高速かつ予測可能でスケーラブルなパフォーマンスを提供します。

**その他のツール**
+ [Jinja](https://jinja.palletsprojects.com/en/) は、テンプレートを最適化された Python コードにコンパイルする拡張可能なテンプレートエンジンです。このパターンでは、Jinja を使用し、テンプレート内にプレースホルダーとロジックを埋め込むことで動的コンテンツを生成します。
+ [PynamoDB](https://pynamodb.readthedocs.io/en/stable/) は、Amazon DynamoDB 用の Python ベースのインターフェイスです。
+ 「[Python](https://www.python.org/)」は汎用のコンピュータプログラミング言語です。

**コードリポジトリ**

このパターンのコードは、GitHub [Auto-generate PynamoDB models and CRUD functions](https://github.com/aws-samples/amazon-reverse-engineer-dynamodb) リポジトリで入手できます。このリポジトリは、コントローラーパッケージとテンプレートの 2 つの主要部分に分かれています。

*コントローラーパッケージ*

コントローラー Python パッケージには、PynamoDB モデルと CRUD 関数の生成に役立つ主要なアプリケーションロジックが含まれています。以下の要素が含まれます。
+ `input_json_validator.py` – この Python スクリプトは入力 JSON スキーマファイルを検証し、ターゲット DynamoDB テーブルのリストと各テーブルに必要な属性を含む Python オブジェクトを作成します。
+ `dynamo_connection.py` – このスクリプトは DynamoDB テーブルへの接続を確立し、`describe_table` オペレーションを使用して PynamoDB モデルの作成に必要な属性を抽出します。
+ `generate_model.py` – このスクリプトには、入力 JSON スキーマファイルと `describe_table` オペレーションに基づいて PynamoDB モデルを作成する Python クラス `GenerateModel` が含まれています。
+ `generate_crud.py` – JSON スキーマファイルで定義されている DynamoDB テーブルの場合、このスクリプトは `GenerateCrud` オペレーションを使用して Python クラスを作成します。

*テンプレート*

この Python ディレクトリには、次の Jinja テンプレートが含まれています。
+ `model.jinja` – この Jinja テンプレートには、PynamoDB モデルスクリプトを生成するためのテンプレート式が含まれています。
+ `crud.jinja` – この Jinja テンプレートには、CRUD 関数スクリプトを生成するためのテンプレート式が含まれています。

## エピック
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-epics"></a>

### 環境をセットアップする
<a name="set-up-the-environment"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| リポジトリのクローン作成 | 次のコマンドを入力して、[Auto-generate PynamoDB models and CRUD functions](https://github.com/aws-samples/amazon-reverse-engineer-dynamodb) リポジトリのクローンを作成します。<pre>git clone https://github.com/aws-samples/amazon-reverse-engineer-dynamodb.git</pre> | アプリ開発者 | 
| Python 環境をセットアップします。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application.html) | アプリ開発者 | 

### PynamoDB モデルと CRUD 関数を生成する
<a name="generate-the-pynamodb-model-and-crud-functions"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| JSON スキーマファイルを変更します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application.html) | アプリ開発者 | 
| Python アプリケーションを実行します。 | 次のコマンドを入力して PynamoDB モデルと CRUD 関数を生成します。ここで、`<input_schema.json>` は JSON スキーマファイルの名前です。<pre>python main.py --file <input_schema.json></pre> | アプリ開発者 | 

### PynamoDB モデルと CRUD 関数を検証する
<a name="verify-the-pynamodb-model-and-crud-functions"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 生成された PynamoDB モデルを検証します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application.html) | アプリ開発者 | 
| 生成された CRUD 関数を検証します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application.html) | アプリ開発者 | 

## 関連リソース
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-resources"></a>
+ [Amazon DynamoDB のコアコンポーネント](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html) (DynamoDB ドキュメント)
+ [DynamoDB でのセカンダリインデックスを使用したデータアクセス性の向上](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html) (DynamoDB ドキュメント)

## 追加情報
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-additional"></a>

**JSON スキーマファイルの属性例**

```
[
{
"name": "test_table",
"region": "ap-south-1",
"attributes": [
{
"name": "id",
"type": "UnicodeAttribute"
},
{
"name": "name",
"type": "UnicodeAttribute"
},
{
"name": "age",
"type": "NumberAttribute"
}
]
}
]
```