

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 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*

## Summary
<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）的兼容性。此模式提供了一个简化 PynamoDB 模型和 CRUD 操作函数的自动创建的库，从而帮助使用 Python 和 DynamoDB 的开发人员。虽然它为数据库表生成基本的 CRUD 函数，但它也可以对 PynamoDB 模型和 Amazon DynamoDB 表中的 CRUD 函数进行逆向工程。此模式旨在通过使用基于 Python 的应用程序来简化数据库操作。

下面是此解决方案的主要功能：
+ **PynamoDB 模型的 JSON 架构** ‒ 通过导入 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/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/74cc4c73-5c8b-448d-98fb-b681cfa5f860/images/c2c367d6-d88a-4f49-8571-89160539eb08.png)


1. 您创建了一个输入 JSON 架构文件。此 JSON 架构文件提供了相应的 DynamoDB 表的属性，您需要根据这些表创建 PynamoDB 模型并为这些表创建 CRUD 函数。它包含以下三个重要密钥：
   + `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/) 是一种基于 Python 的 Amazon DynamoDB 接口。
+ [Python](https://www.python.org/) 是通用的计算机编程语言。

**代码存储库**

此模式的代码可在 GitHub [自动生成 PynamoDB](https://github.com/aws-samples/amazon-reverse-engineer-dynamodb) 模型和 CRUD 函数存储库中找到。该存储库分为两个主要部分：控制器包和模板。

*控制器包*

控制器 Python 包中包含帮助生成 PynamoDB 模型和 CRUD 函数的主要应用程序逻辑。其中包含以下内容：
+ `input_json_validator.py` ‒ 此 Python 脚本验证输入 JSON 架构文件并创建包含目标 DynamoDB 表列表及其各自必需属性的 Python 对象。
+ `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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆存储库。 | 输入以下命令克隆[自动生成 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_cn/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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 修改 JSON 架构文件。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证生成的 PynamoDB 模型。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/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_cn/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"
}
]
}
]
```