

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Generación automática de un modelo de PynamoDB y funciones CRUD para Amazon DynamoDB mediante una aplicación de Python
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application"></a>

*Vijit Vashishtha, Dheeraj Alimchandani y Dhananjay Karanjkar, Amazon Web Services*

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

Es habitual que se requieran entidades y funciones de operaciones de creación, lectura, actualización y eliminación (CRUD) para realizar operaciones de base de datos de Amazon DynamoDB. PynamoDB es una interfaz basada en Python que admite Python 3. También ofrece características como la compatibilidad con las transacciones de Amazon DynamoDB, la serialización y deserialización automáticas de los valores de los atributos y la compatibilidad con los marcos de trabajo más comunes de Python, como Flask y Django. Este patrón permite a los desarrolladores trabajar con Python y DynamoDB, ya que proporciona una biblioteca que facilita la creación automática de modelos de PynamoDB y funciones de operación CRUD. Si bien genera funciones CRUD esenciales para las tablas de bases de datos, también puede aplicar ingeniería inversa a los modelos de PynamoDB y a las funciones CRUD de las tablas de Amazon DynamoDB. Este patrón está diseñado para simplificar las operaciones de la base de datos mediante una aplicación basada en Python.

Estas son algunas de las características principales de la solución:
+ **Esquema JSON a modelo PynamoDB**: genere automáticamente modelos de PynamoDB en Python mediante la importación de un archivo de esquema JSON.
+ **Generación de funciones CRUD**: genere automáticamente funciones para realizar operaciones CRUD en tablas de DynamoDB.
+ **Ingeniería inversa desde DynamoDB**: utilice la asignación relacional de objetos (ORM) de PynamoDB para aplicar ingeniería inversa a los modelos de PynamoDB y a las funciones CRUD de las tablas de Amazon DynamoDB existentes.

## Requisitos previos y limitaciones
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-prereqs"></a>

**Requisitos previos **
+ Un activo Cuenta de AWS
+ La versión 3.8 o posterior de Python [descargada](https://www.python.org/downloads/) e instalada
+ La versión 3.1.2 o posterior de Jinja2 [descargada](https://pypi.org/project/Jinja2/#files) e instalada
+ Tablas de Amazon DynamoDB para las que desea generar ORM
+ AWS Command Line Interface (AWS CLI), [instalado](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) y [configurado](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)
+ La versión 5.4.1 o posterior de PynamoDB [instalada](https://pynamodb.readthedocs.io/en/stable/tutorial.html#installation)

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

**Pila de tecnología de destino**
+ script de JSON
+ aplicación de Python
+ modelo de PynamoDB
+ instancia de base de datos de Amazon DynamoDB

**Arquitectura de destino**

![\[Use una aplicación de Python para generar funciones CRUD y el modelo de PynamoDB a partir de tablas de DynamoDB.\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/74cc4c73-5c8b-448d-98fb-b681cfa5f860/images/c2c367d6-d88a-4f49-8571-89160539eb08.png)


1. Debe crear un archivo de esquema JSON de entrada. Este archivo de esquema JSON representa los atributos de las tablas de DynamoDB respectivas a partir de las que desea crear modelos de PyNamoDB y para las que desea crear funciones CRUD. Contiene estas tres claves importantes:
   + `name`: el nombre de la tabla de destino de DynamoDB.
   + `region`— El Región de AWS lugar donde está alojada la tabla
   + `attributes`: atributos que forman parte de la tabla de destino, como la [clave de partición](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey) (también conocida como *atributo hash*), la [clave de clasificación](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey), los [índices secundarios locales](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LSI.html), los [índices secundarios globales](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html) y cualquier [atributo que no sea clave](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.TablesItemsAttributes). Esta herramienta espera que el esquema de entrada solo proporcione atributos que no sean clave, ya que la aplicación los obtiene directamente de la tabla de destino. Para ver un ejemplo de cómo especificar atributos en el archivo de esquema JSON, consulte la sección [Información adicional](#automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-additional) de este patrón.

1. Ejecute la aplicación Python y proporcione el archivo de esquema JSON como entrada.

1. La aplicación Python lee el archivo de esquema JSON.

1. La aplicación Python se conecta a las tablas de DynamoDB para derivar el esquema y los tipos de datos. La aplicación ejecuta la operación [describe\$1table](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb/client/describe_table.html) y obtiene los atributos clave y de índice de la tabla.

1. La aplicación Python combina los atributos del archivo de esquema JSON y la tabla de DynamoDB. Utiliza el motor de plantillas de Jinja para generar un modelo de PynamoDB y las funciones CRUD correspondientes.

1. Puede acceder al modelo de PynamoDB para realizar operaciones CRUD en la tabla de DynamoDB.

## Tools (Herramientas)
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-tools"></a>

**Servicios de AWS**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) es un servicio de base de datos de NoSQL completamente administrado que ofrece un rendimiento rápido, predecible y escalable.

**Otras herramientas**
+ [Jinja](https://jinja.palletsprojects.com/en/) es un motor de plantillas extensible que compila plantillas en código Python optimizado. Este patrón usa Jinja para generar contenido dinámico al incrustar marcadores de posición y lógica en las plantillas.
+ [PynamoDB](https://pynamodb.readthedocs.io/en/stable/) es una interfaz basada en Python para Amazon DynamoDB.
+ [Python](https://www.python.org/) es un lenguaje de programación informático de uso general.

**Repositorio de código**

El código de este patrón está disponible en el repositorio de funciones CRUD y modelos de [PynamoDB de GitHub generación automática](https://github.com/aws-samples/amazon-reverse-engineer-dynamodb). El repositorio está dividido en dos partes principales: el paquete de controladores y las plantillas.

*Paquete de controladores*

El paquete Python de controladores contiene la lógica de aplicación principal que ayuda a generar el modelo de PynamoDB y las funciones CRUD. Contiene lo siguiente:
+ `input_json_validator.py`: este script de Python valida el archivo de esquema JSON de entrada y crea los objetos Python que contienen la lista de tablas de DynamoDB de destino y los atributos necesarios para cada uno.
+ `dynamo_connection.py`: este script establece una conexión con la tabla de DynamoDB y utiliza la operación `describe_table` para extraer los atributos necesarios para crear el modelo de PynamoDB.
+ `generate_model.py`: este script contiene una clase de Python `GenerateModel` que crea el modelo de PynamoDB en función del archivo de esquema JSON de entrada y de la operación `describe_table`.
+ `generate_crud.py`: para las tablas de DynamoDB que se definen en el archivo de esquema JSON, este script utiliza la operación `GenerateCrud` para crear las clases de Python.

*Plantillas*

Este directorio de Python contiene las siguientes plantillas de Jinja:
+ `model.jinja`: esta plantilla de Jinja contiene la expresión de plantilla para generar el script de modelo de PynamoDB.
+ `crud.jinja`: esta plantilla de Jinja contiene la expresión de plantilla para generar el script de funciones CRUD.

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

### Configuración del entorno
<a name="set-up-the-environment"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Clonar el repositorio. | Introduzca el comando siguiente para clonar el repositorio [Generación automática de modelos de PynamoDB y funciones CRUD](https://github.com/aws-samples/amazon-reverse-engineer-dynamodb).<pre>git clone https://github.com/aws-samples/amazon-reverse-engineer-dynamodb.git</pre> | Desarrollador de aplicaciones | 
| Configure el entorno de Python. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application.html) | Desarrollador de aplicaciones | 

### Generación del modelo de PynamoDB y las funciones CRUD
<a name="generate-the-pynamodb-model-and-crud-functions"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Modifique el archivo de esquema JSON. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application.html) | Desarrollador de aplicaciones | 
| Ejecute la aplicación Python. | Introduzca el siguiente comando para generar los modelos de PynamoDB y las funciones CRUD, donde `<input_schema.json>` es el nombre del archivo de esquema JSON.<pre>python main.py --file <input_schema.json></pre> | Desarrollador de aplicaciones | 

### Verificación del modelo de PynamoDB y las funciones CRUD
<a name="verify-the-pynamodb-model-and-crud-functions"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Compruebe el modelo de PynamoDB generado. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application.html) | Desarrollador de aplicaciones | 
| Verifique las funciones CRUD generadas. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application.html) | Desarrollador de aplicaciones | 

## Recursos relacionados
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-resources"></a>
+ [Componentes básicos de Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html) (documentación de DynamoDB)
+ [Mejora del acceso con índices secundarios](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html) (documentación de DynamoDB)

## Información adicional
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-additional"></a>

**Ejemplos de atributos para el archivo de esquema JSON**

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