amazon-dynamodb - tablas - dynamodb tutorial
El número de atributos en el esquema clave debe coincidir con el número de atributos definidos en las definiciones de atributos (3)
Estoy tratando de crear una tabla simple usando el shell de JavaScript DynamoDB y obtengo esta excepción:
{
"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
}
A continuación se muestra la tabla que estoy tratando de crear:
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);
});
Sin embargo, si agrego el segundo atributo a keySchema, funciona bien. Debajo de la mesa de trabajo:
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);
});
No quiero agregar el rango al esquema clave. ¿Alguna de idea de cómo arreglarlo?
Cuando usa un atributo no clave en "AttributeDefinitions", debe usarlo como índice, de lo contrario es contrario a la forma en que funciona dynamodb. ver link
Por lo tanto, no es necesario poner un atributo que no sea clave en "AttributeDefinitions" si no lo va a utilizar como índice o clave principal.
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
});
También tuve este problema y publicaré aquí lo que me salió mal en caso de que ayude a alguien más.
En mi CreateTableRequest, tenía una matriz vacía para 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>
//{
//}
};
Comentar estas líneas en la creación de la tabla resolvió mi problema. Así que supongo que la lista tiene que ser nula, no vacía.
DynamoDB no tiene esquema (excepto el esquema clave)
Es decir, debe especificar el esquema de clave (nombre y tipo de atributo) cuando crea la tabla. Bueno, no necesita especificar ningún atributo que no sea clave. Puede colocar un elemento con cualquier atributo más tarde (debe incluir las claves, por supuesto).
Desde la
página de documentación
,
AttributeDefinitions
se define como:
Una matriz de atributos que describen el esquema clave para la tabla y los índices.
Cuando crea una tabla, el campo
AttributeDefinitions
se usa solo para las claves hash y / o range.
En su primer caso, solo hay una clave hash (número 1) mientras proporciona 2 Definiciones de atributos.
Esta es la causa raíz de la excepción.
TL; DR
No incluya ninguna definición de atributo no clave en
AttributeDefinitions
.