Разбивка на страницы AWS DynamoDB с ограничением

#amazon-web-services #go #amazon-dynamodb

#amazon-веб-сервисы #Вперед #amazon-dynamodb

Вопрос:

Я пытаюсь разбить записи на страницы из таблицы, созданной в DynamoDB, в любом случае, чтобы проверить, были ли превышены элементы таблицы.

Например, если я выполняю вызов для извлечения элементов из таблицы, я получаю следующую ошибку

 
PANIC: runtime error: invalid memory address or nil pointer dereference
goroutine 51 [running]:
github.com/urfave/negroni.(*Recovery).ServeHTTP.func1(0xdfae028, 0xc000186028, 0xc0002162d0, 0xc000154200)
    /Users/hammadali/go/pkg/mod/github.com/urfave/negroni@v1.0.0/recovery.go:159  0xcb
panic(0x498ea20, 0x51f4410)
    /usr/local/Cellar/go/1.14.5/libexec/src/runtime/panic.go:969  0x166
github.com/prohousing-as/ph-supplier-service/application.(*SupplierService).GetAllSuppliers(0xc0002cc300, 0xc00002a270, 0x24, 0xbb8, 0xc0004403e0, 0x0, 0x0)
    /Users/hammadali/source/ph-supplier-service/application/supplier_service.go:41  0x330
github.com/prohousing-as/ph-supplier-service/ui.(*SupplierController).GetAllSupplier(0xc000526ed0, 0xdfae028, 0xc000186028, 0xc0003be300)
    /Users/hammadali/source/ph-supplier-service/ui/supplier_controller.go:40  0x139
net/http.HandlerFunc.ServeHTTP(0xc000527170, 0xdfae028, 0xc000186028, 0xc0003be300)
    /usr/local/Cellar/go/1.14.5/libexec/src/net/http/server.go:2041  0x44
github.com/gorilla/mux.(*Router).ServeHTTP(0xc0002e40c0, 0xdfae028, 0xc000186028, 0xc0003be100)
    /Users/hammadali/go/pkg/mod/github.com/gorilla/mux@v1.7.4/mux.go:210  0xe2

  

Функция, извлекающая все элементы

 // fetches the items from dynamoDb and stores it in res
res, err := s.SupplierRepo.GetAllSupplier(uuid, limit)
    if err != nil {
        fmt.Println("from application: ", err)
        return nil, err
    }
    item := amp;domain.SupplierTableItems{}
    all := amp;domain.AllSupplierItems{}
    // Looping over the result and appending it on the list
    for _, i := range res.Items {
        err = dynamodbattribute.UnmarshalMap(i, item)
        all.Collection = append(all.Collection, *item)
        if err != nil {
            fmt.Println(err)
        }
    }
    // storing lastEvaluatedKey for pagination
    all.LastEvaluatedKey = *res.LastEvaluatedKey["uuid"].S
    return all, nil
  

Есть ли возможность проверить, превысил ли вызов, выполненный для извлечения элементов, количество записей в таблице, и просто указать количество оставшихся записей.

Комментарии:

1. Вам нужно показать свой код, особенно вокруг строки 41 supplier_service.go (и, возможно, ее вызывающего). Это не просто вопрос API, вы неправильно используете объект и пытаетесь разыменовать nil указатель.

2. Я добавил код функции, используемой для извлечения элементов

Ответ №1:

Ваша ошибка не имеет большого отношения к разбивке на страницы DynamoDB, вы просто пытаетесь получить доступ к чему-то, чего там нет, где-то рядом /Users/hammadali/source/ph-supplier-service/application/supplier_service.go:41

Чтобы ответить на ваш вопрос иначе: да, DynamoDB сообщает вам, когда разбиение на страницы завершено. Из документов:

  • Если результат содержит элемент LastEvaluatedKey и он не равен нулю, перейдите к шагу 2.
  • Если в результате нет LastEvaluatedKey, больше элементов для извлечения нет.

Комментарии:

1. Спасибо. Если таблица содержит 10 элементов, и вы устанавливаете ограничение на 6 одновременно. При первом вызове я получаю 6 элементов и LastEvaluatedKey. Второй вызов с эксклюзивным STARTKEY в качестве LastEvaluatedKey приведет к ошибке недопустимой памяти. Есть ли для этого обходной путь?

2. @HammadAli Внимательно прочитайте ответ, он совершенно ясен — «Если в результате нет LastEvaluatedKey, больше элементов для извлечения нет».. Но вы все еще спрашиваете: «Второй вызов с эксклюзивным STARTKEY в качестве LastEvaluatedKey приведет к ошибке недопустимой памяти. Есть ли для этого обходной путь?». Решение состоит в том, чтобы проверить, есть ли LastEvaluatedKey поле в ответе — если нет, вы закончили разбиение на страницы.

3. @HammadAli вы должны отметить этот ответ как принятый, поскольку он на 100% соответствует вашему вопросу…

4. Боюсь, это не решает мою проблему. Я пытаюсь найти способ обработать ошибку, когда элементов в таблице меньше, чем call в запросе. Поскольку на данный момент он выдает мне недопустимый адрес памяти.

5. Снова. Если имеется 400 элементов, шаг 1: я запрашиваю 300 элементов; я получаю 300 элементов и LastEvaluatedKey. Шаг 2: я запрашиваю 300 элементов с помощью LastEvaluatedKey; Программа паникует из-за недопустимого адреса памяти или разыменования нулевого указателя. Я хочу, чтобы программа выводила оставшиеся 100 элементов без LastEvaluatedKey