D'autres exemples de AWS SDK sont disponibles dans le référentiel AWS Doc SDK Examples
Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Création d'une table DynamoDB avec un index secondaire global à l'aide du SDK AWS
L'exemple de code suivant montre comment créer une table avec un index secondaire global.
- SDK pour Java 2.x
-
Créez une table DynamoDB avec un index secondaire global à l'aide de. AWS SDK for Java 2.x
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.core.waiters.WaiterResponse; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; import software.amazon.awssdk.services.dynamodb.model.CreateTableRequest; import software.amazon.awssdk.services.dynamodb.model.DeleteTableRequest; import software.amazon.awssdk.services.dynamodb.model.DescribeTableRequest; import software.amazon.awssdk.services.dynamodb.model.DescribeTableResponse; import software.amazon.awssdk.services.dynamodb.model.DynamoDbException; import software.amazon.awssdk.services.dynamodb.model.GlobalSecondaryIndex; import software.amazon.awssdk.services.dynamodb.model.Projection; import software.amazon.awssdk.services.dynamodb.model.KeySchemaElement; import software.amazon.awssdk.services.dynamodb.model.KeyType; import software.amazon.awssdk.services.dynamodb.model.ProjectionType; import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughput; import software.amazon.awssdk.services.dynamodb.model.PutItemRequest; import software.amazon.awssdk.services.dynamodb.model.QueryRequest; import software.amazon.awssdk.services.dynamodb.model.QueryResponse; import software.amazon.awssdk.services.dynamodb.model.ScalarAttributeType; import software.amazon.awssdk.services.dynamodb.waiters.DynamoDbWaiter; public class DynamoDbGlobalSecondaryIndexExample { private static final String tableName = "Issues"; private static final DynamoDbClient dynamoDbClient = DynamoDbClient.builder() .region(Region.US_EAST_1) .credentialsProvider(DefaultCredentialsProvider.create()) .build(); public static void main(String[] args) throws Exception { createTable(); loadData(); queryIndex("CreateDateIndex"); queryIndex("TitleIndex"); queryIndex("DueDateIndex"); deleteTable(tableName); } public static void createTable() { try { // Attribute definitions List<AttributeDefinition> attributeDefinitions = new ArrayList<>(); attributeDefinitions.add(AttributeDefinition.builder().attributeName("IssueId").attributeType(ScalarAttributeType.S).build()); attributeDefinitions.add(AttributeDefinition.builder().attributeName("Title").attributeType(ScalarAttributeType.S).build()); attributeDefinitions.add(AttributeDefinition.builder().attributeName("CreateDate").attributeType(ScalarAttributeType.S).build()); attributeDefinitions.add(AttributeDefinition.builder().attributeName("DueDate").attributeType(ScalarAttributeType.S).build()); // Key schema for table List<KeySchemaElement> tableKeySchema = new ArrayList<>(); tableKeySchema.add(KeySchemaElement.builder().attributeName("IssueId").keyType(KeyType.HASH).build()); // Partition key tableKeySchema.add(KeySchemaElement.builder().attributeName("Title").keyType(KeyType.RANGE).build()); // Sort key // Initial provisioned throughput settings for the indexes ProvisionedThroughput ptIndex = ProvisionedThroughput.builder() .readCapacityUnits(1L) .writeCapacityUnits(1L) .build(); // CreateDateIndex List<KeySchemaElement> createDateKeySchema = new ArrayList<>(); createDateKeySchema.add(KeySchemaElement.builder().attributeName("CreateDate").keyType(KeyType.HASH).build()); createDateKeySchema.add(KeySchemaElement.builder().attributeName("IssueId").keyType(KeyType.RANGE).build()); Projection createDateProjection = Projection.builder() .projectionType(ProjectionType.INCLUDE) .nonKeyAttributes("Description", "Status") .build(); GlobalSecondaryIndex createDateIndex = GlobalSecondaryIndex.builder() .indexName("CreateDateIndex") .keySchema(createDateKeySchema) .projection(createDateProjection) .provisionedThroughput(ptIndex) .build(); // TitleIndex List<KeySchemaElement> titleKeySchema = new ArrayList<>(); titleKeySchema.add(KeySchemaElement.builder().attributeName("Title").keyType(KeyType.HASH).build()); titleKeySchema.add(KeySchemaElement.builder().attributeName("IssueId").keyType(KeyType.RANGE).build()); Projection titleProjection = Projection.builder() .projectionType(ProjectionType.KEYS_ONLY) .build(); GlobalSecondaryIndex titleIndex = GlobalSecondaryIndex.builder() .indexName("TitleIndex") .keySchema(titleKeySchema) .projection(titleProjection) .provisionedThroughput(ptIndex) .build(); // DueDateIndex List<KeySchemaElement> dueDateKeySchema = new ArrayList<>(); dueDateKeySchema.add(KeySchemaElement.builder().attributeName("DueDate").keyType(KeyType.HASH).build()); Projection dueDateProjection = Projection.builder() .projectionType(ProjectionType.ALL) .build(); GlobalSecondaryIndex dueDateIndex = GlobalSecondaryIndex.builder() .indexName("DueDateIndex") .keySchema(dueDateKeySchema) .projection(dueDateProjection) .provisionedThroughput(ptIndex) .build(); CreateTableRequest createTableRequest = CreateTableRequest.builder() .tableName(tableName) .keySchema(tableKeySchema) .attributeDefinitions(attributeDefinitions) .globalSecondaryIndexes(createDateIndex, titleIndex, dueDateIndex) .provisionedThroughput(ProvisionedThroughput.builder() .readCapacityUnits(1L) .writeCapacityUnits(1L) .build()) .build(); System.out.println("Creating table " + tableName + "..."); dynamoDbClient.createTable(createTableRequest); // Wait for table to become active System.out.println("Waiting for " + tableName + " to become ACTIVE..."); DynamoDbWaiter waiter = dynamoDbClient.waiter(); DescribeTableRequest describeTableRequest = DescribeTableRequest.builder() .tableName(tableName) .build(); WaiterResponse<DescribeTableResponse> waiterResponse = waiter.waitUntilTableExists(describeTableRequest); waiterResponse.matched().response().ifPresent( response -> System.out.println("Table is now ready for use")); } catch (DynamoDbException e) { System.err.println("Error creating table: " + e.getMessage()); e.printStackTrace(); } } public static void queryIndex(String indexName) { try { System.out.println("\n***********************************************************\n"); System.out.print("Querying index " + indexName + "..."); Map<String, AttributeValue> expressionAttributeValues = new HashMap<>(); String keyConditionExpression; if (indexName.equals("CreateDateIndex")) { System.out.println("Issues filed on 2013-11-01"); keyConditionExpression = "CreateDate = :v_date and begins_with(IssueId, :v_issue)"; expressionAttributeValues.put(":v_date", AttributeValue.builder().s("2013-11-01").build()); expressionAttributeValues.put(":v_issue", AttributeValue.builder().s("A-").build()); } else if (indexName.equals("TitleIndex")) { System.out.println("Compilation errors"); keyConditionExpression = "Title = :v_title and begins_with(IssueId, :v_issue)"; expressionAttributeValues.put(":v_title", AttributeValue.builder().s("Compilation error").build()); expressionAttributeValues.put(":v_issue", AttributeValue.builder().s("A-").build()); } else if (indexName.equals("DueDateIndex")) { System.out.println("Items that are due on 2013-11-30"); keyConditionExpression = "DueDate = :v_date"; expressionAttributeValues.put(":v_date", AttributeValue.builder().s("2013-11-30").build()); } else { System.out.println("\nNo valid index name provided"); return; } QueryRequest queryRequest = QueryRequest.builder() .tableName(tableName) .indexName(indexName) .keyConditionExpression(keyConditionExpression) .expressionAttributeValues(expressionAttributeValues) .build(); QueryResponse response = dynamoDbClient.query(queryRequest); System.out.println("Query: printing results..."); // Process results for (Map<String, AttributeValue> item : response.items()) { printItem(item); } } catch (DynamoDbException e) { System.err.println("Error querying index: " + e.getMessage()); e.printStackTrace(); } } private static void printItem(Map<String, AttributeValue> item) { StringBuilder sb = new StringBuilder("{\n"); for (Map.Entry<String, AttributeValue> entry : item.entrySet()) { String attributeName = entry.getKey(); AttributeValue attributeValue = entry.getValue(); sb.append(" \"").append(attributeName).append("\": "); if (attributeValue.s() != null) { sb.append("\"").append(attributeValue.s()).append("\""); } else if (attributeValue.n() != null) { sb.append(attributeValue.n()); } else if (attributeValue.bool() != null) { sb.append(attributeValue.bool()); } else if (attributeValue.hasL()) { sb.append(attributeValue.l()); } else if (attributeValue.hasM()) { sb.append(attributeValue.m()); } sb.append(",\n"); } sb.append("}"); System.out.println(sb.toString()); } public static void deleteTable(String tableName) { try { System.out.println("Deleting table " + tableName + "..."); DeleteTableRequest deleteTableRequest = DeleteTableRequest.builder() .tableName(tableName) .build(); dynamoDbClient.deleteTable(deleteTableRequest); // Wait for table to be deleted System.out.println("Waiting for " + tableName + " to be deleted..."); DynamoDbWaiter waiter = dynamoDbClient.waiter(); DescribeTableRequest describeTableRequest = DescribeTableRequest.builder() .tableName(tableName) .build(); WaiterResponse<DescribeTableResponse> waiterResponse = waiter.waitUntilTableNotExists(describeTableRequest); waiterResponse.matched().response().ifPresent( response -> System.out.println("Table has been deleted")); } catch (DynamoDbException e) { System.err.println("Error deleting table: " + e.getMessage()); e.printStackTrace(); } } public static void loadData() { System.out.println("Loading data into table " + tableName + "..."); // IssueId, Title, Description, CreateDate, LastUpdateDate, DueDate, Priority, Status putItem("A-101", "Compilation error", "Can't compile Project X - bad version number. What does this mean?", "2013-11-01", "2013-11-02", "2013-11-10", 1, "Assigned"); putItem("A-102", "Can't read data file", "The main data file is missing, or the permissions are incorrect", "2013-11-01", "2013-11-04", "2013-11-30", 2, "In progress"); putItem("A-103", "Test failure", "Functional test of Project X produces errors", "2013-11-01", "2013-11-02", "2013-11-10", 1, "In progress"); putItem("A-104", "Compilation error", "Variable 'messageCount' was not initialized.", "2013-11-15", "2013-11-16", "2013-11-30", 3, "Assigned"); putItem("A-105", "Network issue", "Can't ping IP address 127.0.0.1. Please fix this.", "2013-11-15", "2013-11-16", "2013-11-19", 5, "Assigned"); } public static void putItem(String issueId, String title, String description, String createDate, String lastUpdateDate, String dueDate, Integer priority, String status) { try { HashMap<String, AttributeValue> itemValues = new HashMap<>(); // Add all attributes itemValues.put("IssueId", AttributeValue.builder().s(issueId).build()); itemValues.put("Title", AttributeValue.builder().s(title).build()); itemValues.put("Description", AttributeValue.builder().s(description).build()); itemValues.put("CreateDate", AttributeValue.builder().s(createDate).build()); itemValues.put("LastUpdateDate", AttributeValue.builder().s(lastUpdateDate).build()); itemValues.put("DueDate", AttributeValue.builder().s(dueDate).build()); itemValues.put("Priority", AttributeValue.builder().n(priority.toString()).build()); itemValues.put("Status", AttributeValue.builder().s(status).build()); PutItemRequest putItemRequest = PutItemRequest.builder() .tableName(tableName) .item(itemValues) .build(); dynamoDbClient.putItem(putItemRequest); } catch (DynamoDbException e) { System.err.println("Error adding item: " + e.getMessage()); e.printStackTrace(); } } }
-
Pour plus de détails sur l'API, reportez-vous CreateTableà la section Référence des AWS SDK for Java 2.x API.
-