키 스키마의 속성 수는 속성 정의에 정의 된 속성 수와 일치해야합니다.


109

DynamoDB 자바 스크립트 셸을 사용하여 간단한 테이블을 생성하려고하는데이 예외가 발생합니다.


    {   
    "message": "The number of attributes in key schema must match the number of attributes defined in attribute definitions.",
    "code": "ValidationException",
    "time": "2015-06-16T10:24:23.319Z",
    "statusCode": 400,
    "retryable": false 
    }

아래는 내가 만들려는 테이블입니다.


    var params = {
        TableName: 'table_name',
        KeySchema: [ 
            { 
                AttributeName: 'hash_key_attribute_name',
                KeyType: 'HASH',
            },

        ],
        AttributeDefinitions: [ 
            {
                AttributeName: 'hash_key_attribute_name',
                AttributeType: 'S', 
            },
            {
                AttributeName: 'attribute_name_1',
                AttributeType: 'S', 
            }
        ],
        ProvisionedThroughput: { 
            ReadCapacityUnits: 1, 
            WriteCapacityUnits: 1, 
        },


    };
    dynamodb.createTable(params, function(err, data) {
        if (err) print(err); 
        else print(data); 
    });

그러나 keySchema에 두 번째 속성을 추가하면 제대로 작동합니다. 작업 테이블 아래 :


    var params = {
        TableName: 'table_name',
        KeySchema: [ 
            { 
                AttributeName: 'hash_key_attribute_name',
                KeyType: 'HASH',
            },
            { 
                AttributeName: 'attribute_name_1', 
                KeyType: 'RANGE', 
            }

        ],
        AttributeDefinitions: [ 
            {
                AttributeName: 'hash_key_attribute_name',
                AttributeType: 'S', 
            },
            {
                AttributeName: 'attribute_name_1',
                AttributeType: 'S', 
            }
        ],
        ProvisionedThroughput: { 
            ReadCapacityUnits: 1, 
            WriteCapacityUnits: 1, 
        },


    };
    dynamodb.createTable(params, function(err, data) {
        if (err) print(err); 
        else print(data); 
    });

범위를 키 스키마에 추가하고 싶지 않습니다. 그것을 고치는 방법을 아십니까?


DynamoDBLocal에 대해서만 발생합니까? 실제 서비스에 대해 동일한 작업을 시도하면 어떻게됩니까?
mkobit

아직 AWS 계정이 없어 실제 서비스에 대해 테스트 할 수 없습니다. 최신 버전의 DynamoDB 로컬 (dynamodb_local_2015-04-27_1.0)을 사용하고 있습니다.
NAbbas

1
dynamodb_local_2016-04-19
Chris

2
Mingliang의 TL; DR은 모든 것을 말합니다.
Chris

답변:


230

DynamoDB는 스키마가 없습니다 (키 스키마 제외).

즉, 테이블을 생성 할 때 키 스키마 (속성 이름 및 유형)를 지정해야합니다. 키가 아닌 속성을 지정할 필요가 없습니다. 나중에 속성이있는 항목을 넣을 수 있습니다 (물론 키를 포함해야 함).

로부터 문서 페이지 의는 AttributeDefinitions다음과 같이 정의된다

테이블 및 인덱스의 키 스키마를 설명하는 속성 배열입니다.

테이블을 만들 때 AttributeDefinitions필드는 해시 및 / 또는 범위 키에만 사용됩니다. 첫 번째 경우에는 2 개의 AttributeDefinition을 제공하는 동안 해시 키 (숫자 1) 만 있습니다. 이것이 예외의 근본 원인입니다.

TL; DR에 키가 아닌 속성 정의를 포함하지 마십시오 AttributeDefinitions.


10
한 가지 예외를 제외하고 AttributeDefinitions는 키가 인덱스에서 hash또는 range키로 사용될 경우 키가 아닌 속성이 있어야합니다
Srle

23

at에서 키가 아닌 속성을 "AttributeDefinitions"사용하는 경우이를 인덱스로 사용해야합니다. 그렇지 않으면 DynamoDB의 작동 방식에 위배됩니다. 링크를 참조하십시오 .

따라서 "AttributeDefinitions"인덱스 또는 기본 키로 사용하지 않을 경우 키가 아닌 속성을 넣을 필요 가 없습니다.

var params = {
        TableName: 'table_name',
        KeySchema: [ // The type of of schema.  Must start with a HASH type, with an optional second RANGE.
            { // Required HASH type attribute
                AttributeName: 'UserId',
                KeyType: 'HASH',
            },
            { // Optional RANGE key type for HASH + RANGE tables
                AttributeName: 'RemindTime', 
                KeyType: 'RANGE', 
            }
        ],
        AttributeDefinitions: [ // The names and types of all primary and index key attributes only
            {
                AttributeName: 'UserId',
                AttributeType: 'S', // (S | N | B) for string, number, binary
            },
            {
                AttributeName: 'RemindTime',
                AttributeType: 'S', // (S | N | B) for string, number, binary
            },
            {
                AttributeName: 'AlarmId',
                AttributeType: 'S', // (S | N | B) for string, number, binary
            },
            // ... more attributes ...
        ],
        ProvisionedThroughput: { // required provisioned throughput for the table
            ReadCapacityUnits: 1, 
            WriteCapacityUnits: 1, 
        },
        LocalSecondaryIndexes: [ // optional (list of LocalSecondaryIndex)
            { 
                IndexName: 'index_UserId_AlarmId',
                KeySchema: [ 
                    { // Required HASH type attribute - must match the table's HASH key attribute name
                        AttributeName: 'UserId',
                        KeyType: 'HASH',
                    },
                    { // alternate RANGE key attribute for the secondary index
                        AttributeName: 'AlarmId', 
                        KeyType: 'RANGE', 
                    }
                ],
                Projection: { // required
                    ProjectionType: 'ALL', // (ALL | KEYS_ONLY | INCLUDE)
                },
            },
            // ... more local secondary indexes ...
        ],
    };
    dynamodb.createTable(params, function(err, data) {
        if (err) ppJson(err); // an error occurred
        else ppJson(data); // successful response
    });

2

나는 또한이 문제가 있었고 다른 사람에게 도움이 될 경우를 위해 무엇이 잘못되었는지 여기에 게시 할 것입니다.

CreateTableRequest에서 GlobalSecondaryIndexes.

CreateTableRequest createTableRequest = new CreateTableRequest
{
  TableName = TableName,
  ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = 2, WriteCapacityUnits = 2 },
  KeySchema = new List<KeySchemaElement>
  {
     new KeySchemaElement
     {
        AttributeName = "Field1",
        KeyType = KeyType.HASH
     },
     new KeySchemaElement
     {
        AttributeName = "Field2",
        KeyType = KeyType.RANGE
     }
  },
  AttributeDefinitions = new List<AttributeDefinition>()
  {
     new AttributeDefinition
     {
         AttributeName = "Field1", 
         AttributeType = ScalarAttributeType.S
     },
     new AttributeDefinition
     {
        AttributeName = "Field2",
        AttributeType = ScalarAttributeType.S
     }
  },
  //GlobalSecondaryIndexes = new List<GlobalSecondaryIndex>
  //{                            
  //}
};

테이블 생성에서 이러한 줄을 주석으로 처리하면 문제가 해결되었습니다. 그래서 목록이 null비어 있지 않아야 한다고 생각합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.