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

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);
    });

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



답변

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

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

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

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

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

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


답변

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
    });


답변

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

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비어 있지 않아야 한다고 생각합니다 .


답변