Próbuję utworzyć prostą tabelę przy użyciu powłoki javascript DynamoDB i otrzymuję ten wyjątek:
{
"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
}
Poniżej znajduje się tabela, którą próbuję utworzyć:
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);
});
Jeśli jednak dodam drugi atrybut do keySchema, działa dobrze. Poniżej stołu roboczego:
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);
});
Nie chcę dodawać zakresu do schematu klucza. Masz jakiś pomysł, jak to naprawić?
amazon-dynamodb
dynamo-local
NAbbas
źródło
źródło
Odpowiedzi:
DynamoDB nie ma schematu (z wyjątkiem schematu klucza)
Oznacza to, że podczas tworzenia tabeli musisz określić schemat klucza (nazwę i typ atrybutu). Cóż, nie musisz określać żadnych atrybutów niebędących kluczami. Później możesz umieścić przedmiot z dowolnym atrybutem (oczywiście musi zawierać klucze).
Od strony dokumentacji ,
AttributeDefinitions
jest zdefiniowany jako:Podczas tworzenia tabeli
AttributeDefinitions
pole jest używane tylko dla kluczy hash i / lub range. W pierwszym przypadku jest tylko klucz hash (numer 1), podczas gdy podajesz 2 AttributeDefinitions. To jest główna przyczyna wyjątku.TL; DR Nie dołączaj żadnych definicji atrybutów niebędących kluczami w
AttributeDefinitions
.źródło
AttributeDefinitions
jeśli ten klucz będzie używany jakohash
lubrange
klucz w indeksieKiedy używasz atrybutu niebędącego kluczem w at
"AttributeDefinitions"
, musisz użyć go jako indeksu, w przeciwnym razie jest to sprzeczne ze sposobem działania DynamoDB. Zobacz link .Więc nie ma potrzeby umieszczania atrybutu niebędącego kluczem,
"AttributeDefinitions"
jeśli nie zamierzasz go używać jako indeksu lub klucza podstawowego.źródło
Ja też miałem ten problem i napiszę tutaj, co poszło nie tak, jeśli komuś to pomoże.
W moim
CreateTableRequest
miałem pustą tablicę dlaGlobalSecondaryIndexes
.Skomentowanie tych wierszy w tworzeniu tabeli rozwiązało mój problem. Więc myślę, że lista musi być
null
, a nie pusta.źródło