programing

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

nasanasas 2020. 10. 9. 11:16
반응형

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


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.


"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

    });

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

In my CreateTableRequest, I had an empty array for the 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>
  //{                            
  //}
};

Commenting out these lines in the table creation solved my problem. So I guess the list has to be null, not empty.

참고URL : https://stackoverflow.com/questions/30866030/number-of-attributes-in-key-schema-must-match-the-number-of-attributes-defined-i

반응형