Blog de Amazon Web Services (AWS)

Consultar datos con DynamoDB Shell: una interfaz de línea de comandos para Amazon DynamoDB

Por Amrith Kumar,

 

Para los recién llegados a DynamoDB, la curva de aprendizaje puede ser empinada, por lo que desarrollamos DynamoDB Shell (ddbsh), una interfaz de línea de comandos de código abierto para Amazon DynamoDB. Uno de los objetivos de ddbsh es proporcionar un entorno sencillo e intuitivo para los recién llegados a DynamoDB que les permita comenzar, ejecutando comandos familiares similares a sentencias de lenguaje estructurado (Structured Query Language, SQL). El lenguaje de consulta en ddbsh se deriva de SQL y tiene extensiones específicas de DynamoDB.Por ejemplo, puedes usar ddbsh para crear una tabla ejecutando un comando como:

create table ddbsh_demo (id number) primary key (id hash);

Puede obtener una introducción rápida a ddbsh desde Hello DynamoDB shell y profundizar un poco más en la creación y consulta de índices secundarios globales en Primeros pasos con dynamodb-shell. El archivo ddbsh README.md tiene un uso detallado de comandos y ejemplos.

Esta publicación abarca dos temas. Primero, aprenderá cómo conectarse a DynamoDB y luego a DynamoDB local. Después, se aprenderemos un método para filtrar datos usando la cláusula WHERE de SQL

Para comenzar, descargue el código fuente ddbsh de AWS Labs en Github y siga las instrucciones para construirlo.

Conéctese a una región de AWS

ddbsh utiliza el SDK de AWS C++. Puede configurar los parámetros de conexión según lo documentado para la interfaz de línea de comandos de AWS. Consulte Variables de ambiente para configurar AWS CLI para obtener más información.

Para conectarse a una región

  1. Revise la región predeterminada, la clave de acceso de AWS y la clave secreta de AWS en el archivo de configuración de AWS. Consulte la documentación para conocer la ubicación exacta del archivo en su sistema operativo. La documentación proporciona orientación específica para DynamoDB local y DynamoDB (servicio web). También puede usar el comando aws configure o establecer variables de ambiente para determinar cómo conectarse a DynamoDB.
  2. Compruebe si puede conectarse a DynamoDB mediante la CLI de AWS. Por ejemplo, podrá ejecutar:
aws dynamodb list-tables

3. Resuelva cualquier error. Después de ejecutar el comando anterior sin ningún error, podrá conectarse a su Región predeterminada como se muestra en la sesión interactiva que sigue.

% ddbsh
ddbsh - version 0.2
us-east-1>

4. En el símbolo del sistema, puede ejecutar comandos. Para obtener una lista de comandos, ejecute el comando HELP. Los comandos se terminan con un punto y coma (;)

us-east-1> help;
HELP - provide help in ddbsh

   HELP <keyword> [keyword [keyword ...]]
[]

Conéctese a DynamoDB local.

Antes de comenzar este paso, asegúrese de tener ddbsh versión 0.2 o superior y AWS SDK versión 1.11 o superior.

Para conectarse a DynamoDB local

  1. Siga las instrucciones para instalar DynamoDB local en su computadora.
  2. En una sesión de terminal, configure las variables de ambiente para conectarse a la instancia local de DynamoDB.
% export AWS_ACCESS_KEY_ID="fakeMyKeyId"
% export AWS_SECRET_ACCESS_KEY="fakeSecretAccessKey"
% export AWS_DEFAULT_REGION="dynamodb-local"
% export DDBSH_ENDPOINT_OVERRIDE="http://localhost:8000"

3. En una segunda sesión de terminal, inicie DynamoDB local.

% java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar

4. Regrese a la primera sesión de terminal. Debería poder conectarse con DynamoDB local mediante un comando de la CLI de AWS similar al siguiente:

% aws dynamodb  --endpoint-url http://localhost:8000  list-tables
{
    "TableNames": []
}

5. Si pudo realizar esto correctamente, entonces puede conectarte a la instancia local con ddbsh.

% ddbsh
ddbsh - version 0.2
dynamodb-local (*)>

El asterisco entre paréntesis (*) después del nombre de la región indica que se está utilizando un punto de acceso no estándar. Ahora estás conectado a DynamoDB local. Tenga en cuenta que cuando se conecta a DynamoDB local, las pruebas unitarias no tendrán éxito.

Filtrar datos con la cláusula WHERE

Puede usar una cláusula WHERE con SELECT, UPDATE, DELETE y UPSERT. En la cláusula WHERE, se pueden incluir múltiples expresiones lógicas que se pueden unir con el AND  lógico y el OR lógico. Además, se puede negar una expresión lógica con el operador NOT.

Se admiten las siguientes expresiones lógicas.

  • Comparación lógica en la forma  attribute op value where attribute is a table attribute, op is one of <, >, <=, >=, =, or !=.
  • attribute_exists(attr) evalúa como verdadero si attr existe en un elemento.
  • begins_with(attr, prefix) evalúa como verdadero si attr comienza con prefijo.
  • attr between value and value evalúa como verdadero si attr está entre los dos valores proporcionados.
  • attribute_type (attr, type) evalúa como verdadero si attr es del tipo especificado.

Considere estos datos de muestra:

dynamodb-local (*)> select * from exprtest;
{a: 2, b: 2}
{a: 1, b: 2}
{a: 3, b: cooperate}
{a: 5, c: coffee}
{a: 4, b: coffee}
dynamodb-local (*)>

Aquí hay algunas consultas de muestra:

dynamodb-local (*)> select * from exprtest where a > 3 and a < 5;
{a: 4, b: coffee}

dynamodb-local (*)> select * from exprtest where a between 2 and 5;
{a: 2, b: 2}
{a: 3, b: cooperate}
{a: 5, c: coffee}
{a: 4, b: coffee}

dynamodb-local (*)> select * from exprtest where begins_with(b, "co");
{a: 3, b: cooperate}
{a: 4, b: coffee}

dynamodb-local (*)> select * from exprtest where attribute_exists(c);
{a: 5, c: coffee}

dynamodb-local (*)> select * from exprtest where attribute_exists(c) and a != 3;
{a: 5, c: coffee}

dynamodb-local (*)> select * from exprtest where attribute_exists(c) or a = 3;
{a: 3, b: cooperate}
{a: 5, c: coffee}

dynamodb-local (*)> select * from exprtest where attribute_type(b, string);
{a: 3, b: cooperate}
{a: 4, b: coffee}
dynamodb-local (*)>

Puede escribir consultas más complejas usando paréntesis para agrupar elementos.

dynamodb-local (*)> select * from exprtest where attribute_type(b, string) or ( a = 5 and c = "coffee");
{a: 3, b: cooperate}
{a: 5, c: coffee}
{a: 4, b: coffee}

Puede usar el comando EXPLAIN para ver cómo ddbsh ejecutará la consulta.

dynamodb-local (*)> explain select * from exprtest where attribute_type(b, string) or ( a = 5 and c = "coffee");
Scan({
   "TableName":   "exprtest",
   "ReturnConsumedCapacity":   "NONE",
   "FilterExpression":   "attribute_type(#apaa1, :vpaa1) OR (#apaa2 = :vpaa2 AND #apaa3 = :vpaa3)",
   "ExpressionAttributeNames":   {
      "#apaa1":   "b",
      "#apaa2":   "a",
      "#apaa3":   "c"
   },
   "ExpressionAttributeValues":   {
      ":vpaa1":   {
         "S":   "S"
      },
      ":vpaa2":   {
         "N":   "5"
      },
      ":vpaa3":   {
         "S":   "coffee"
      }
   },
   "ConsistentRead":   false
})
dynamodb-local (*)>

También puede usar una cláusula WHERE en una operación de tipo UPDATE.

dynamodb-local (*)> help update;
UPDATE - Update items in a table

   UPDATE <name> SET <update_set> [where clause]

   UPDATE <name> REMOVE <remove list> [where clause]

dynamodb-local (*)>

dynamodb-local (*)> update exprtest set b = 15 where a = 5;
UPDATE (0 read, 1 modified, 0 ccf)
dynamodb-local (*)> select * from exprtest where a = 5;
{a: 5, b: 15, c: coffee}
dynamodb-local (*)>

Puede eliminar un atributo. En el siguiente ejemplo se elimina el atributo c.

dynamodb-local (*)> update exprtest remove c where a = 5; 
UPDATE (0 read, 1 modified, 0 ccf)
dynamodb-local (*)> select * from exprtest where a = 5;
{a: 5, b: 15}
dynamodb-local (*)>

Limpieza

Una vez que haya completado sus pruebas, recuerde eliminar las tablas que haya creado para evitar incurrir en costos. Puede usar DROP TABLE en ddbsh para hacer eso. Puede detener DynamoDB local en la terminal donde lo inició (la segunda sesión), y apagarlo con Ctrl-C.

Conclusión

Entonces, ahí lo tiene, con  ddbsh puede leer, modificar o eliminar datos de una tabla y puede filtrar sobre qué elementos se actúa usando la cláusula WHERE, tal como lo haría en SQL estándar.Hemos escuchado de clientes y prospectos que quieren recursos que les ayuden a aprender la API de DynamoDB. Estamos experimentando con algunas soluciones a esto, como el comando EXPLAIN en ddbsh. Agradeceríamos sus comentarios sobre esta herramienta. ¿Qué podemos agregar a ddbsh que le facilitaría el uso de DynamoDB?

Si hay funciones o funcionalidades específicas que le gustaría ver implementadas en ddbsh, háganoslo saber ingresando un ticket de soporte o enviándome un correo electrónico directamente a amrithie (at) amazon (dot) com. También estamos buscando colaboradores que estén interesados en ayudar a extender y mantener ddbsh. Específicamente, si desea enviar solicitudes de extracción (pull requests) que faciliten a los usuarios la instalación y el uso de ddbsh (como por ejemplo, proporcionando scripts de empaquetamiento) eso sería muy apreciado. Ya se ha enviado una solicitud de extracción (pull request) para una contribución a homebrew. Para cualquier otra solicitud de aportación no dude en ponerse en contacto directamente con amrithie (at) amazon (punto) com.

Un último llamado a la acción para todos ustedes. Si requiere una solución homebrew para instalar ddbsh en macOS, ayúdanos bifurcando, protagonizando y viendo el repositorio ddbsh GitHub. La solicitud de extracción al repositorio homebrew ha sido enviada pero el repositorio ddbsh GitHub no es lo suficientemente conocido. Por lo tanto, la solicitud está actualmente bloqueada. Por favor ayudar a avanzar esta solicitud.

 

Este artículo fue traducido del Blog de AWS en Inglés.

 


Acerca del autor

Amrith Kumar es ingeniero Principal Senior en Amazon Web Services y trabaja en Amazon DynamoDB.

 

 

 

 

Traductor

Sergio Nuñez es especialista en bases de datos con el equipo de aceleración de la nube de Amazon Web Services. Sergio se enfoca en liderar los esfuerzos de migración de bases de datos a AWS, así como proporcionar orientación técnica que incluye optimización de costos, monitoreo y experiencia en modernización a los clientes de Amazon.