Ошибка при создании таблицы динамо-базы Ha sh Ключ не указан в определениях атрибутов - PullRequest
0 голосов
/ 01 марта 2020

Я получаю сообщение об ошибке при создании таблицы динамической БД с использованием AWS SDK для Java 2.0. Ключ ha sh указан, но все еще появляется ошибка

    @Bean
  ApplicationRunner applicationRunner(DynamoDbClient dynamoDbClient) {
    return args -> {
      dynamoDbClient.listTables().tableNames().forEach(System.out::println);

  CreateTableRequest createTableRequest =
      CreateTableRequest.builder()
          .keySchema(
              KeySchemaElement.builder().keyType(KeyType.HASH).attributeName("id").build())
          .attributeDefinitions(
              AttributeDefinition.builder()
                  .attributeName("campaign_name")
                  .attributeType(ScalarAttributeType.S)
                  .build())
          .provisionedThroughput(
              ProvisionedThroughput.builder()
                  .readCapacityUnits(5L)
                  .writeCapacityUnits(5L)
                  .build())
          .tableName("campaign")
          .build();
  try {
    dynamoDbClient.createTable(createTableRequest);
    dynamoDbClient.listTables().tableNames().forEach(System.out::println);
  } catch (DynamoDbException e) {
    System.err.println(e.getMessage());
  }
};

}

Ошибка:

Ha sh Ключ не указан в определениях атрибутов. Тип неизвестен. (Сервис: DynamoDb, Код состояния: 400, Идентификатор запроса: bed4b8c3-f312-4a9d-8d7b-a2184dacce54)

Я пытаюсь создать таблицу с ключевым и неключевым столбцом

@Bean
ApplicationRunner applicationRunner(DynamoDbClient dynamoDbClient) {
    return args -> {
      dynamoDbClient.listTables().tableNames().forEach(System.out::println);

      CreateTableRequest createTableRequest =
          CreateTableRequest.builder()
              .attributeDefinitions(
                  AttributeDefinition.builder()
                      .attributeName("id")
                      .attributeType(ScalarAttributeType.S)
                      .build(),
                  AttributeDefinition.builder()
                      .attributeName("name")
                      .attributeType(ScalarAttributeType.S)
                      .build())
              .keySchema(
                  KeySchemaElement.builder()
                      .keyType(KeyType.HASH)
                      .attributeName("campaign_id")
                      .build())
              .provisionedThroughput(
                  ProvisionedThroughput.builder()
                      .readCapacityUnits(5L)
                      .writeCapacityUnits(5L)
                      .build())
              .tableName("campaign")
              .build();
      try {
        dynamoDbClient.createTable(createTableRequest);
        dynamoDbClient.listTables().tableNames().forEach(System.out::println);
      } catch (DynamoDbException e) {
        System.err.println(e.getMessage());
      }
    };
  }

Ошибка - Количество атрибутов в схеме ключей должно соответствовать количеству атрибутов, определенных в определениях атрибутов.

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Я думаю, что campaign_id - это ключ HA SH, и он должен быть в AttributeDefinitions.

              AttributeDefinition.builder()
                  .attributeName("campaign_id")
                  .attributeType(ScalarAttributeType.S)
                  .build(),
0 голосов
/ 01 марта 2020

Полагаю, вам нужно добавить AttributeDefinition для вашего KeySchemeElement.

Попробуйте добавить следующее к вашему attributeDefinitions вызову

AttributeDefinition.builder()
              .attributeName("campaign_id")
              .attributeType(ScalarAttributeType.S)
              .build()
...