Estou tentando criar uma tabela simples usando o shell javascript do DynamoDB e estou recebendo esta exceção:
{
"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
}
Abaixo está a tabela que estou tentando criar:
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);
});
No entanto, se eu adicionar o segundo atributo ao keySchema, ele funcionará bem. Abaixo da mesa de trabalho:
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);
});
Não quero adicionar o intervalo ao esquema de chave. Alguma idéia de como consertar isso?
amazon-dynamodb
dynamo-local
NAbbas
fonte
fonte
Respostas:
DynamoDB não tem esquema (exceto o esquema chave)
Ou seja, você precisa especificar o esquema de chave (nome e tipo do atributo) ao criar a tabela. Bem, você não precisa especificar nenhum atributo não-chave. Você pode colocar um item com qualquer atributo posteriormente (deve incluir as chaves, é claro).
Na página de documentação , o
AttributeDefinitions
é definido como:Quando você cria uma tabela, o
AttributeDefinitions
campo é usado apenas para as chaves hash e / ou de intervalo. Em seu primeiro caso, há apenas a chave hash (número 1) enquanto você fornece 2 Definições de atributo. Essa é a causa raiz da exceção.TL; DR Não inclua nenhuma definição de atributo não-chave em
AttributeDefinitions
.fonte
AttributeDefinitions
se essa chave for usada comohash
ourange
chave no índiceAo usar um atributo não-chave em em
"AttributeDefinitions"
, você deve usá-lo como um índice, caso contrário, é contra a maneira como o DynamoDB funciona. Veja o link .Portanto, não há necessidade de inserir um atributo não-chave
"AttributeDefinitions"
se não for usá-lo como índice ou chave primária.fonte
Eu também tive esse problema e postarei aqui o que deu errado para mim, caso ajude outra pessoa.
No meu
CreateTableRequest
, eu tinha um array vazio para oGlobalSecondaryIndexes
.Comentar essas linhas na criação da tabela resolveu meu problema. Então eu acho que a lista tem que estar
null
, não vazia.fonte