

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Python 應用程式自動產生 Amazon DynamoDB 的 PynamoDB 模型和 CRUD 函數 DynamoDB
<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>

通常需要實體和建立、讀取、更新和刪除 (CRUD) 操作函數，才能有效率地執行 Amazon DynamoDB 資料庫操作。PynamoDB 是以 Python 為基礎的介面，支援 Python 3。它還提供功能，例如支援 Amazon DynamoDB 交易、自動屬性值序列化和還原序列化，以及與常見 Python 架構的相容性，例如 Flask 和 Django。此模式透過提供簡化 DynamoDB 模型和 CRUD 操作函數自動建立的PynamoDB。雖然它為資料庫資料表產生必要的 CRUD 函數，但也可以從 Amazon PynamoDB 資料表反向工程 PynamoDB 模型和 CRUD 函數。 DynamoDB 此模式旨在使用 Python 型應用程式簡化資料庫操作。

以下是此解決方案的主要功能：
+ **PynamoDB 模型的 JSON 結構描述** – 透過匯入 JSON 結構描述檔案，在 Python 中自動產生 PynamoDB 模型。
+ **CRUD 函數產生** – 自動產生函數，以在 DynamoDB 資料表上執行 CRUD 操作。
+ **從 DynamoDB 反向工程** – 使用 PynamoDB 物件關聯映射 (ORM) 對現有 Amazon DynamoDB 資料表的 PynamoDB 模型和 CRUD 函數進行反向工程。 DynamoDB 

## 先決條件和限制
<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)

## Architecture
<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 模型。 DynamoDB](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/74cc4c73-5c8b-448d-98fb-b681cfa5f860/images/c2c367d6-d88a-4f49-8571-89160539eb08.png)


1. 您可以建立輸入 JSON 結構描述檔案。此 JSON 結構描述檔案代表您要從 和 CRUD 函數建立 PynamoDB 模型之個別 DynamoDB 資料表的屬性。 PynamoDB 它包含以下三個重要金鑰：
   + `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\_table](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 [自動產生 PynamoDB 模型和 CRUD 函數](https://github.com/aws-samples/amazon-reverse-engineer-dynamodb)儲存庫中使用。儲存庫分為兩個主要部分：控制器套件和範本。

*控制器套件*

控制器 Python 套件包含主要應用程式邏輯，可協助產生 PynamoDB 模型和 CRUD 函數。其中包含下列各項：
+ `input_json_validator.py` – 此 Python 指令碼會驗證輸入 JSON 結構描述檔案，並建立 Python 物件，其中包含目標 DynamoDB 資料表的清單，以及每個資料表的必要屬性。
+ `dynamo_connection.py` – 此指令碼會建立與 DynamoDB 資料表的連線，並使用 `describe_table`操作擷取建立 PynamoDB 模型所需的屬性。
+ `generate_model.py` – 此指令碼包含 Python 類別`GenerateModel`，可根據輸入 JSON 結構描述檔案和 `describe_table`操作來建立 PynamoDB 模型。
+ `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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製儲存庫。 | 輸入下列命令以複製[自動產生 PynamoDB 模型和 CRUD 函數](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/zh_tw/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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 修改 JSON 結構描述檔案。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 驗證產生的 PynamoDB 模型。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/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/zh_tw/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 文件）
+ [使用次要索引改善資料存取 ](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"
}
]
}
]
```