ValidationException: таблица не имеет указанного индекса: GameTitleIndex
Я использую Vogels, средство отображения данных DynamoDB для NodeJS. Я запрашиваю глобальный индекс согласно документации Vogels. Все, что я сделал, это создал модель с таким глобальным вторичным индексом:
let MyModel = vogels.define('MyModel', {
hashKey: 'uuid',
timestamps: true,
updatedAt: 'updated_at',
createdAt: 'created_at',
schema: MyModelBaseSchema,
indexes : [{
hashKey : 'gameTitle', rangeKey : 'topScore', name : 'GameTitleIndex', type : 'global'
}]
});
и запрос по этому индексу
MyModel.query('game 1')
.usingIndex('GameTitleIndex')
.loadAll()
.select("COUNT");
При запуске любых тестов показывает исключение ValidationException: The table does not have the specified index: GameTitleIndex
Согласно документации, это все, что мне нужно сделать, чтобы получить данные. Есть ли что-нибудь, что я пропустил при запросе этого индекса? Любые ответы будут оценены. Заранее спасибо.
2 ответа
Если кто-то застрял на той же проблеме, вот ответ: после создания нового индекса в модели, либо локального вторичного индекса, либо глобального вторичного индекса, необходимо запустить миграцию. Только после этого таблица будет иметь указанный индекс. Обратитесь к этому вопросу для получения дополнительных разъяснений.
- Если вы используете Serverless framework с плагинами serverless-Dynamodb-local и serverless-offline (для локального тестирования).
- И если вы создали новый локальный вторичный индекс, но команда, показанная ниже, все еще не показывает его подLocalSecondaryIndexes
узел конфигурации:
aws dynamodb describe-table --table-name YOUT_TABLE_NAME --endpoint-url http://localhost:8000
- И если вы получаете ошибку ValidationException: The table does not have the specified index: YOUR_INDEX_NAME
при использовании кода, подобного показанному ниже:
query(uid, id) {
const params = {
TableName: YOUR_TABLE_NAME,
IndexName: YOUR_LSI_NAME,
KeyConditionExpression: "#uid = :uid and #id = :id",
ExpressionAttributeNames: {
"#uid": "uid",
"#id": "id",
},
ExpressionAttributeValues: { ":uid": uid, ":id": id },
};
return DB.query(params).promise();
}
Тогда, скорее всего, вам нужно удалить локальный файл базы данных DynamoDB и перезапустить службы сserverless offline start
команда. Это заставит воссоздать локальный файл базы данных DynamoDB с соответствующими локальными вторичными индексами.
Чтобы удалить локальный файл базы данных DynamoDB, выполните следующие действия:
- Обновите
serverless.yml
указав путь к базе данных DynamoDB, как показано ниже:
custom:
dynamodb:
stages:
- ${self:provider.stage}
start:
port: 8000
inMemory: true
migrate: true
dbPath: "./.db" # Make sure that folder exists!
- Теперь вы можете перейти в папку
./.db
и удалить файлshared-local-instance.db
(это база данных SQLite, имитирующая DynamoDB:0).
В результате при следующем запуске с командой serverless offline start
до даты файла базы данных локального DynamoDB будет создана.