DynamoDb me parece una buena opción para utilizar una base de datos (no relacional) en la nube.
DynamoDb se puede utilizar en diferentes tamaños de proyectos desde proyectos pequeños a muy grandes, con todas son bondades de tiempos de respuesta bajos y gran escalabilidad.
Ejercicio
Vamos a almacenar los resultados de los partidos de futbol de una o mas ligas.
Requisitos:
- Tener una cuenta de AWS
- Tener configuradas las credenciales de AWS en la maquina (en la consola de mac o linux ejecutar AWS configure para definir el Access key ID).Se utiliza este método solo por ser 'practico', no es aconsejable para entornos productivos.
- Tener instalado python y la libreria boto3 (pip install boto3)
Editor
Visual Studio Code
1) Inicialmente se debe importar la librería de boto3 e iniciar el recurso para la utilización de DynamoDB
import boto3 from boto3.dynamodb.conditions import Key dynamodb = boto3.resource("dynamodb")
2) Creación de la tabla PartidosFutbol con la Partition Key Liga (tipo string) y la Sort Key Partido (tipo string)
dynamodb.create_table( TableName='PartidosFutbol', KeySchema=[ { 'AttributeName': 'Liga', 'KeyType': 'HASH' # Partition key }, { 'AttributeName': 'Partido', 'KeyType': 'RANGE' # Sort key } ], #Se deben crear las llaves nuevamente con su tipo de dato AttributeDefinitions=[ { 'AttributeName': 'Liga', 'AttributeType': 'S' # Se utiliza S para tipos de datos String y N para numeros }, { 'AttributeName': 'Partido', 'AttributeType': 'S' } ], ProvisionedThroughput={ 'ReadCapacityUnits': 5, 'WriteCapacityUnits': 5 } )
3) Vamos a ingresar el resultado de un partido de futbol
Chelsea 1 - 2 Machester City de la Premier League, jugado el 26/09/2021
table = dynamodb.Table("PartidosFutbol") table.put_item(Item={ "Liga": "Premier League#2021/22", "Partido":"Chelsea#Manchester City#2021/09/26", "Local":"Chelsea", "Visitante":"Manchester City", "MarcadorLocal":1, "MarcadorVisitante": 2, "Fecha":"2021/09/26" })
4) Revisando el resultado final no fue Chelsea 1 - 2 Manchester City, el resultado final fue: Chelsea 0 - 1 Manchester City. Por lo tanto debemos actualizar la información en nuestra base de datos.
table.update_item( Key={ "Liga": "Premier League#2021/22", "Partido": "Chelsea#Manchester City#2021/09/26" }, UpdateExpression="set MarcadorVisitante=:marcador_visitante,MarcadorLocal=:marcador_local", ExpressionAttributeValues={ ":marcador_visitante":1, ":marcador_local":0 }, ReturnValues="UPDATED_NEW" )
Es importante tener en cuenta, para las actualizaciones se debe usar siempre el Partition Key y el Sort Key siempre y cuando este ultimo se haya definido en la tabla.
5) Como nuestra base de datos tiene muy poca información, vamos a registrar mas resultados.
partidos = [] partido1 = {"Liga": "Premier League#2021/22","Partido":"Arsenal#Tottenham Hotspur#2021/09/26","Local":"Arsenal","Visitante":"Tottenham","MarcadorLocal":3,"MarcadorVisitante": 1,"Fecha":"2021/09/25"} partido2 = {"Liga": "LaLiga#2021/22","Partido":"Athletic Bilbao#Rayo Vallecano#2021/09/21","Local":"Athletic Bilbao","Visitante":"Rayo Vallecano","MarcadorLocal":1,"MarcadorVisitante": 2,"Fecha":"2021/09/21"} partidos.append(partido1) partidos.append(partido2) with table.batch_writer() as batch: for p in partidos: content = { "Liga": p["Liga"], "Partido":p["Partido"], "Local":p["Local"], "Visitante":p["Visitante"], "MarcadorLocal":p["MarcadorLocal"], "MarcadorVisitante": p["MarcadorVisitante"], "Fecha":p["Fecha"] } batch.put_item(Item=content)
batch_writer: nos sirve para escribir o borrar muchos datos de manera eficiente.
6)Ahora vamos a consultar los partidos de la liga inglesa.
table.query(KeyConditionExpression=Key('Liga').eq("Premier League#2021/22"), ProjectionExpression="table.query(KeyConditionExpression=Key('Liga').eq("Premier League#2021/22"), ProjectionExpression="#L,MarcadorLocal,Visitante,MarcadorVisitante", ExpressionAttributeNames = {'#L': 'Local'} ),MarcadorLocal,Visitante,MarcadorVisitante", ExpressionAttributeNames = {'#L': 'Local'} )
ProjectionExpression: Se utiliza para definir que columnas va a retornar la consulta
ExpressionAttributeNames: Se utiliza para definir los alias de las columnas
En este caso se utiliza el alias #L para la columna Local ya que Local es una palabra reservada de DynamoDB
7)Ahora queremos traer un partido especifico de la liga española.
table.query(KeyConditionExpression=Key('Liga').eq("LaLiga#2021/22") & Key("Partido").eq("Athletic Bilbao#Rayo Vallecano#2021/09/21") )
8)En este paso vamos a traer los partido por una fecha especifica.
table.query(KeyConditionExpression=Key('Liga').eq("Premier League#2021/22"), FilterExpression= 'Fecha = :Fecha', ExpressionAttributeValues= { ':Fecha': '2021/09/25' } )
9)Como ultimo paso de nuestro CRUD vamos a eliminar un partido de nuestra tabla.
table.delete_item( Key={ 'Liga': "Premier League#2021/22", "Partido":"Chelsea#Manchester City#2021/09/26" }, ConditionExpression="MarcadorLocal = :marcador_local and MarcadorVisitante =:marcador_visante", ExpressionAttributeValues={ ":marcador_local": 0, ":marcador_visante": 1, } )
Para el caso de delete_item se debe especificar la Partition Key y el Sort Key siempre y cuando este ultimo se haya definido en la tabla.
Referencias
Me pueden encontrar en
Top comments (0)