Uso de tablas en DynamoDB - AWS SDK para C++

Uso de tablas en DynamoDB

Las tablas son los contenedores de todos los elementos de una base de datos de DynamoDB. Para poder añadir o eliminar datos de DynamoDB, debe crear una tabla.

Para cada tabla, debe definir:

  • Un nombre de tabla que sea único para su Cuenta de AWS y Región de AWS.

  • Una clave principal para la que cada valor debe ser único. No hay dos elementos de la tabla que puedan tener el mismo valor de clave principal.

    Una clave principal puede ser simple, formada por una sola clave de partición (HASH) o compuesta, formada por una clave de partición y una clave de ordenación (RANGE).

    Cada valor de clave tiene un tipo de datos asociado enumerado por la clase ScalarAttributeType. El valor de clave puede ser binario (B), numérico (N) o una cadena (S). Para obtener más información, consulte Reglas de nomenclatura y tipos de datos en la Guía para desarrolladores de Amazon DynamoDB.

  • Valores de rendimiento aprovisionado que definan el número de unidades de capacidad de lectura/escritura reservadas para la tabla.

    nota

    Los precios de Amazon DynamoDB se basan en los valores de desempeño aprovisionado que puede definir en sus tablas para que solo se reserve la capacidad que piensa que va a necesitar para la tabla.

    El desempeño aprovisionado para una tabla se puede modificar en cualquier momento, por lo que puede ajustar la capacidad si cambian sus necesidades.

Crear una tabla

Use el método CreateTable del cliente de DynamoDB para crear una tabla de DynamoDB. Debe crear los atributos de la tabla y un esquema de tabla, que se pueden usar para identificar la clave principal de la tabla. También debe proporcionar los valores iniciales de rendimiento aprovisionados y un nombre de tabla. CreateTable es una operación asíncrona. GetTableStatus devolverá CREATING hasta que la tabla esté ACTIVE y lista para su uso.

Creación de una tabla con una clave principal simple

Este código crea una tabla con una clave principal simple ("Name").

Incluye

#include <aws/core/Aws.h> #include <aws/dynamodb/DynamoDBClient.h> #include <aws/dynamodb/model/AttributeDefinition.h> #include <aws/dynamodb/model/CreateTableRequest.h> #include <aws/dynamodb/model/KeySchemaElement.h> #include <aws/dynamodb/model/ProvisionedThroughput.h> #include <aws/dynamodb/model/ScalarAttributeType.h> #include <iostream>

Código

//! Create an Amazon DynamoDB table. /*! \sa createTable() \param tableName: Name for the DynamoDB table. \param primaryKey: Primary key for the DynamoDB table. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ bool AwsDoc::DynamoDB::createTable(const Aws::String &tableName, const Aws::String &primaryKey, const Aws::Client::ClientConfiguration &clientConfiguration) { Aws::DynamoDB::DynamoDBClient dynamoClient(clientConfiguration); std::cout << "Creating table " << tableName << " with a simple primary key: \"" << primaryKey << "\"." << std::endl; Aws::DynamoDB::Model::CreateTableRequest request; Aws::DynamoDB::Model::AttributeDefinition hashKey; hashKey.SetAttributeName(primaryKey); hashKey.SetAttributeType(Aws::DynamoDB::Model::ScalarAttributeType::S); request.AddAttributeDefinitions(hashKey); Aws::DynamoDB::Model::KeySchemaElement keySchemaElement; keySchemaElement.WithAttributeName(primaryKey).WithKeyType( Aws::DynamoDB::Model::KeyType::HASH); request.AddKeySchema(keySchemaElement); Aws::DynamoDB::Model::ProvisionedThroughput throughput; throughput.WithReadCapacityUnits(5).WithWriteCapacityUnits(5); request.SetProvisionedThroughput(throughput); request.SetTableName(tableName); const Aws::DynamoDB::Model::CreateTableOutcome &outcome = dynamoClient.CreateTable( request); if (outcome.IsSuccess()) { std::cout << "Table \"" << outcome.GetResult().GetTableDescription().GetTableName() << " created!" << std::endl; } else { std::cerr << "Failed to create table: " << outcome.GetError().GetMessage() << std::endl; return false; } return waitTableActive(tableName, dynamoClient); }

Consulte el ejemplo completo

Creación de una tabla con una clave primaria compuesta

Añada otro objeto AttributeDefinition y KeySchemaElement a CreateTableRequest.

Incluye

#include <aws/core/Aws.h> #include <aws/dynamodb/DynamoDBClient.h> #include <aws/dynamodb/model/AttributeDefinition.h> #include <aws/dynamodb/model/CreateTableRequest.h> #include <aws/dynamodb/model/KeySchemaElement.h> #include <aws/dynamodb/model/ProvisionedThroughput.h> #include <aws/dynamodb/model/ScalarAttributeType.h> #include <iostream>

Código de

//! Create an Amazon DynamoDB table with a composite key. /*! \sa createTableWithCompositeKey() \param tableName: Name for the DynamoDB table. \param partitionKey: Name for the partition (hash) key. \param sortKey: Name for the sort (range) key. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ bool AwsDoc::DynamoDB::createTableWithCompositeKey(const Aws::String &tableName, const Aws::String &partitionKey, const Aws::String &sortKey, const Aws::Client::ClientConfiguration &clientConfiguration) { Aws::DynamoDB::DynamoDBClient dynamoClient(clientConfiguration); std::cout << "Creating table " << tableName << " with a composite primary key:\n" \ "* " << partitionKey << " - partition key\n" \ "* " << sortKey << " - sort key\n"; Aws::DynamoDB::Model::CreateTableRequest request; Aws::DynamoDB::Model::AttributeDefinition hashKey1, hashKey2; hashKey1.WithAttributeName(partitionKey).WithAttributeType( Aws::DynamoDB::Model::ScalarAttributeType::S); request.AddAttributeDefinitions(hashKey1); hashKey2.WithAttributeName(sortKey).WithAttributeType( Aws::DynamoDB::Model::ScalarAttributeType::S); request.AddAttributeDefinitions(hashKey2); Aws::DynamoDB::Model::KeySchemaElement keySchemaElement1, keySchemaElement2; keySchemaElement1.WithAttributeName(partitionKey).WithKeyType( Aws::DynamoDB::Model::KeyType::HASH); request.AddKeySchema(keySchemaElement1); keySchemaElement2.WithAttributeName(sortKey).WithKeyType( Aws::DynamoDB::Model::KeyType::RANGE); request.AddKeySchema(keySchemaElement2); Aws::DynamoDB::Model::ProvisionedThroughput throughput; throughput.WithReadCapacityUnits(5).WithWriteCapacityUnits(5); request.SetProvisionedThroughput(throughput); request.SetTableName(tableName); const Aws::DynamoDB::Model::CreateTableOutcome &outcome = dynamoClient.CreateTable( request); if (outcome.IsSuccess()) { std::cout << "Table \"" << outcome.GetResult().GetTableDescription().GetTableName() << "\" was created!" << std::endl; } else { std::cerr << "Failed to create table:" << outcome.GetError().GetMessage() << std::endl; return false; } return waitTableActive(tableName, dynamoClient); }

Consulte el ejemplo completo en GitHub.

Mostrar tablas

Puede mostrar las tablas de una región determinada llamando al método ListTables del cliente de DynamoDB.

Incluye

#include <aws/core/Aws.h> #include <aws/core/utils/Outcome.h> #include <aws/dynamodb/DynamoDBClient.h> #include <aws/dynamodb/model/ListTablesRequest.h> #include <aws/dynamodb/model/ListTablesResult.h> #include <iostream>

Código

//! List the Amazon DynamoDB tables for the current AWS account. /*! \sa listTables() \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ bool AwsDoc::DynamoDB::listTables( const Aws::Client::ClientConfiguration &clientConfiguration) { Aws::DynamoDB::DynamoDBClient dynamoClient(clientConfiguration); Aws::DynamoDB::Model::ListTablesRequest listTablesRequest; listTablesRequest.SetLimit(50); do { const Aws::DynamoDB::Model::ListTablesOutcome &outcome = dynamoClient.ListTables( listTablesRequest); if (!outcome.IsSuccess()) { std::cout << "Error: " << outcome.GetError().GetMessage() << std::endl; return false; } for (const auto &tableName: outcome.GetResult().GetTableNames()) std::cout << tableName << std::endl; listTablesRequest.SetExclusiveStartTableName( outcome.GetResult().GetLastEvaluatedTableName()); } while (!listTablesRequest.GetExclusiveStartTableName().empty()); return true; }

De forma predeterminada, se devuelven hasta 100 tablas por llamada. Utilice GetExclusiveStartTableName en el objeto ListTablesOutcome devuelto para obtener la última tabla que se ha evaluado. Puede utilizar este valor para iniciar el listado después del último valor devuelto de la enumeración anterior.

Consulte el ejemplo completo

Recuperación de información sobre una tabla

Puede obtener más información sobre una tabla llamando al método DescribeTable del cliente de DynamoDB.

Incluye

#include <aws/core/Aws.h> #include <aws/dynamodb/DynamoDBClient.h> #include <aws/dynamodb/model/DescribeTableRequest.h> #include <iostream>

Code

//! Describe an Amazon DynamoDB table. /*! \sa describeTable() \param tableName: The DynamoDB table name. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ bool AwsDoc::DynamoDB::describeTable(const Aws::String &tableName, const Aws::Client::ClientConfiguration &clientConfiguration) { Aws::DynamoDB::DynamoDBClient dynamoClient(clientConfiguration); Aws::DynamoDB::Model::DescribeTableRequest request; request.SetTableName(tableName); const Aws::DynamoDB::Model::DescribeTableOutcome &outcome = dynamoClient.DescribeTable( request); if (outcome.IsSuccess()) { const Aws::DynamoDB::Model::TableDescription &td = outcome.GetResult().GetTable(); std::cout << "Table name : " << td.GetTableName() << std::endl; std::cout << "Table ARN : " << td.GetTableArn() << std::endl; std::cout << "Status : " << Aws::DynamoDB::Model::TableStatusMapper::GetNameForTableStatus( td.GetTableStatus()) << std::endl; std::cout << "Item count : " << td.GetItemCount() << std::endl; std::cout << "Size (bytes): " << td.GetTableSizeBytes() << std::endl; const Aws::DynamoDB::Model::ProvisionedThroughputDescription &ptd = td.GetProvisionedThroughput(); std::cout << "Throughput" << std::endl; std::cout << " Read Capacity : " << ptd.GetReadCapacityUnits() << std::endl; std::cout << " Write Capacity: " << ptd.GetWriteCapacityUnits() << std::endl; const Aws::Vector<Aws::DynamoDB::Model::AttributeDefinition> &ad = td.GetAttributeDefinitions(); std::cout << "Attributes" << std::endl; for (const auto &a: ad) std::cout << " " << a.GetAttributeName() << " (" << Aws::DynamoDB::Model::ScalarAttributeTypeMapper::GetNameForScalarAttributeType( a.GetAttributeType()) << ")" << std::endl; } else { std::cerr << "Failed to describe table: " << outcome.GetError().GetMessage(); } return outcome.IsSuccess(); }

Consulte el ejemplo completo en GitHub.

Modificación de una tabla

Puede modificar los valores de rendimiento aprovisionados de la tabla en cualquier momento llamando al método UpdateTable del cliente de DynamoDB.

Incluye

#include <aws/core/Aws.h> #include <aws/core/utils/Outcome.h> #include <aws/dynamodb/DynamoDBClient.h> #include <aws/dynamodb/model/ProvisionedThroughput.h> #include <aws/dynamodb/model/UpdateTableRequest.h> #include <iostream>

Código de

//! Update a DynamoDB table. /*! \sa updateTable() \param tableName: Name for the DynamoDB table. \param readCapacity: Provisioned read capacity. \param writeCapacity: Provisioned write capacity. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ bool AwsDoc::DynamoDB::updateTable(const Aws::String &tableName, long long readCapacity, long long writeCapacity, const Aws::Client::ClientConfiguration &clientConfiguration) { Aws::DynamoDB::DynamoDBClient dynamoClient(clientConfiguration); std::cout << "Updating " << tableName << " with new provisioned throughput values" << std::endl; std::cout << "Read capacity : " << readCapacity << std::endl; std::cout << "Write capacity: " << writeCapacity << std::endl; Aws::DynamoDB::Model::UpdateTableRequest request; Aws::DynamoDB::Model::ProvisionedThroughput provisionedThroughput; provisionedThroughput.WithReadCapacityUnits(readCapacity).WithWriteCapacityUnits( writeCapacity); request.WithProvisionedThroughput(provisionedThroughput).WithTableName(tableName); const Aws::DynamoDB::Model::UpdateTableOutcome &outcome = dynamoClient.UpdateTable( request); if (outcome.IsSuccess()) { std::cout << "Successfully updated the table." << std::endl; } else { const Aws::DynamoDB::DynamoDBError &error = outcome.GetError(); if (error.GetErrorType() == Aws::DynamoDB::DynamoDBErrors::VALIDATION && error.GetMessage().find("The provisioned throughput for the table will not change") != std::string::npos) { std::cout << "The provisioned throughput for the table will not change." << std::endl; } else { std::cerr << outcome.GetError().GetMessage() << std::endl; return false; } } return waitTableActive(tableName, dynamoClient); }

Consulte el ejemplo completo

Eliminar una tabla

Llame al método DeleteTable del cliente de DynamoDB y transfiérale el nombre de la tabla.

Incluye

#include <aws/core/Aws.h> #include <aws/dynamodb/DynamoDBClient.h> #include <aws/dynamodb/model/DeleteTableRequest.h> #include <iostream>

Código

//! Delete an Amazon DynamoDB table. /*! \sa deleteTable() \param tableName: The DynamoDB table name. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ bool AwsDoc::DynamoDB::deleteTable(const Aws::String &tableName, const Aws::Client::ClientConfiguration &clientConfiguration) { Aws::DynamoDB::DynamoDBClient dynamoClient(clientConfiguration); Aws::DynamoDB::Model::DeleteTableRequest request; request.SetTableName(tableName); const Aws::DynamoDB::Model::DeleteTableOutcome &result = dynamoClient.DeleteTable( request); if (result.IsSuccess()) { std::cout << "Your table \"" << result.GetResult().GetTableDescription().GetTableName() << " was deleted.\n"; } else { std::cerr << "Failed to delete table: " << result.GetError().GetMessage() << std::endl; } return result.IsSuccess(); }

Consulte el ejemplo completo en GitHub.

Más información