Blog
AWS SDK para Python (Boto3) – DynamoDB
- Publicado por: Jhonny
- Categoría: Blog
Integrar Amazon DynamoDB en nuestra plataforma
Crear tabla
Crear, Leer, Actualizar y Eliminar registros de la tabla
DynamoDB
Es una base de datos de key-value con un muy buen rendimiento que nos provee AWS. Grandes compañías del mundo la utilizan debido a la velocidad de respuesta y la increíble capacidad de soportar grandes cantidades de solicitudes simultáneamente.
Crear una tabla
La función create_table añade una tabla a nuestra cuenta de AWS. Cabe resaltar que podemos tener dos tablas con el mismo nombre pero deben pertenecer a regiones diferentes (region_name). Esta función es asíncrona, así que si la ejecutamos debemos visualizar el estado de la creación de la tabla en nuestro dashboard de DynamoDB o usar la acción DescribeTable, antes de insertar valores en ella.
Al igual que en los otros dos servicios, utilizaremos el client de boto3 para acceder a DynamoDB.
La funcion, al igual que todas las demas, requiere parametros para poder ser exitosa.
AttributeDefinitions: Es un arreglo de atributos que describe nuestro esquema inicial para la tabla. OJO, si añadimos más de un valor, DynamoDB interpretara que la llave primaria de nuestra tabla es una combinación de los dos valores, lo cual puede generarnos problemas al momento de hacer actualizar los registros si no expresamos bien nuestro “query”.
TableName: Es el nombre que le daremos a nuestra tabla.
KeySchema: Especifica el atributo que hará de llave primaria para nuestra tabla, este atributo debe estar previamente definido en AttributeDefinitions… de lo contrario obtendremos un error al crear la tabla.
Como bien sabemos, AWS no es gratis y como este servicio es muy concurrido por los usuarios, al momento de crear la tabla debemos especificar parámetro BillingMode.
BillingMode: Controla cómo nos cobrará por el read-write y para manejar nuestra capacidad de solicitudes. En cualquier momento podemos cambiar estas opciones a través del dashboard de DynamoDB.
ProvisionedThroughput: Acá podemos configurar el número de solicitudes de read-write por segundo que pensamos manejar en nuestra aplicación. Este parámetro es opcional pero debe ser explicito al momento de utilizar BillingMode=PROVISIONED.
Luego de repasar los parámetros y requerimientos para hacer funcionar la funcion create_table, aquí un ejemplo:
import boto3 client = boto3.client('dynamodb', aws_access_key_id="TU_ACCESS_KEY_ID", aws_secret_access_key="TU_AWS_SECRET_ACCESS_KEY", region_name="TU_REGION_NAME") client.create_table( AttributeDefinitions=[ { # Nombre de nuestro atributo 'AttributeName': 'usuario_id', # atributo de tipo numero 'AttributeType': 'N' } ], # nombre de nuestra tabla TableName='CantidadLoginPorUsuario', KeySchema=[ { # indicamos de nuevo nuestro atributo pero esta vez lo estamos volviendo un primary key 'AttributeName': 'usuario_id', # Aca tenemos dos opciones RANGE o HASH. # Range se utiliza mas que todo para clasificar y ordenar registros por el valor de la clave, cosa que para este campo no nos interesa. # Hash se utiliza para distribuir de manera uniforme los elementos en funcion de sus valores de clave. 'KeyType': 'HASH' } ], # Estos parametros son necesarios para el cobro del servicio, que es una tonteria pero de igual manera no es totalmente gratuito. BillingMode="PROVISIONED", ProvisionedThroughput={ # numero de solicitudes de lectura por segundo 'ReadCapacityUnits': 1, # numero de solicitudes de escritura por segundo 'WriteCapacityUnits': 1 # Aumentar estos numeros en funcion de sus requerimientos, 1 es solo de prueba. } )
En el anterior ejemplo, creamos una tabla llamada “CantidadDeLoginPorUsuario” donde almacenaremos: usuario_id (clave). Ahora, el siguiente paso es registrar elementos en nuestra tabla de DynamoDB.
Crear registro en tabla
Como bien sabemos, en nuestra tabla existe un atributo llamado usuario_id, que es nuestra clave primaria. Pero… qué haremos solo con almacenar una clave primaria? Y la cantidad de login de usuarios?. Al momento de insertar un valor en nuestra tabla de DynamoDB podemos crear un nuevo campo (Lo hemos realizado de esta manera para que DynamoDB no interprete que la combinación de los dos campos es la clave primaria de nuestra tabla).
Asimismo, cuando añadimos un registro en nuestra tabla debemos especificar varios parámetros, los cuales son:
TableName: Nombre de nuestra tabla
Item: El objeto que vamos a insertar. El cual debemos indicar los campos que ocupará (en este caso usuario_id y cantidad_de_login). Cada tipo de dichos campos deben ser explícitamente declarados como la llave de cada objeto, como lo vemos en el ejemplo a continuación:
import boto3 client = boto3.client('dynamodb', aws_access_key_id="TU_ACCESS_KEY_ID", aws_secret_access_key="TU_AWS_SECRET_ACCESS_KEY", region_name="TU_REGION_NAME") client.put_item( TableName='CantidadLoginPorUsuario', Item={ # A traves de un dict, indicamos el tipo de variable y el valor que enviaremos. A pesar de que es un numero, Boto3 recibe ese parametro como una string. 'usuario_id': {"N": "1"}, 'cantidad_de_login': {"N": "1"} # 1 como valor inicial } )
Actualizar registro en tabla
Ahora que vamos a actualizar la cantidad de login que ha realizado el usuario, necesitamos algo muy simple: Un incrementador. Para ello utilizaremos la función update_item, dicha función requiere de varios parámetros:
- TableName: Nombre de nuestra tabla en DynamoDB
- Key: Nuestra llave primaria que indicamos al momento de crear la tabla.
- UpdateExpression: Nuestra expresión para incrementar el valor de login de un usuario (en este caso).
- ExpressionAttributeValues: Los valores que utilizaremos para nuestra expresión, en este caso solo necesitamos sumarle 1.
import boto3 client = boto3.client('dynamodb', aws_access_key_id="TU_ACCESS_KEY_ID", aws_secret_access_key="TU_AWS_SECRET_ACCESS_KEY", region_name="TU_REGION_NAME") client.update_item( TableName='CantidadLoginPorUsuario', # le enviamos la primary key, en este caso es el usuario_id 1 Key={ 'usuario_id': {"N": "1"} }, # en la expresion de update, debemos colocar el campo que queremos incrementar (logicamente), adicional a eso, debemos enviarle un numero, en este caso es un login mas asi que enviamos 1 UpdateExpression="SET cantidad_de_login = cantidad_de_login + :val", ExpressionAttributeValues={ ':val': { 'N': '1' } } )
Obtener un item
Para obtener un item de nuestra tabla de DynamoDB, debemos utilizar la funcion get_item, seguida de varios parametros.
TableName: El nombre de nuestra tabla de DynamoDB.
Key: La llave primaria que indicamos al crear la tabla.
import boto3 client = boto3.client('dynamodb', aws_access_key_id="TU_ACCESS_KEY_ID", aws_secret_access_key="TU_AWS_SECRET_ACCESS_KEY", region_name="TU_REGION_NAME") respuesta = client.get_item( TableName='CantidadLoginPorUsuario', Key={ 'usuario_id': { 'N': "1" } } ) # la respuesta es un dict con clave "Item", podemos acceder a ella para obtener el resultado print(respuesta['Item']) # {'cantidad_de_login': {'N': '1'}, 'usuario_id': {'N': '1'}})
Eliminar un item
Para eliminar un ítem podemos utilizar la función delete_item, la cual recibe exactamente los mismos parámetros que get_item pero que realiza otra acción.
import boto3 client = boto3.client('dynamodb', aws_access_key_id="TU_ACCESS_KEY_ID", aws_secret_access_key="TU_AWS_SECRET_ACCESS_KEY", region_name="TU_REGION_NAME") client.delete_item( TableName='CantidadLoginPorUsuario', Key={ 'usuario_id': { # enviamos el id del usuario a eliminar 'N': "1" } } )