Sobes.tech
Back to questions
Middle+
4

func (r *OrderRepository) GetActiveOrderIDs(ctx context.Context, offset, limit int) ([]uint32, error) { var ( res []uint32 args []interface{} ) query := `SELECT id FROM "order" WHERE is_terminated = false LIMIT $1 OFFSET $2;` args = append(args, limit, offset) rows, err := r.slave.Query(ctx, query, args...) if err != nil { return nil, err } for rows.Next() { var orderID uint32 if err = rows.Scan(&orderID); err != nil { return nil, err } res = append(res, orderID) } return res, nil }

Companies where asked
Lenta Tech

Answer from AI

sobes.tech AI

В данном методе на Go реализован запрос к базе данных для получения идентификаторов активных заказов с пагинацией (offset и limit).

Код корректно использует подготовленный запрос с параметрами, что предотвращает SQL-инъекции.

Однако, есть несколько рекомендаций для улучшения:

  • Желательно закрывать rows после использования, чтобы избежать утечек ресурсов:
rows, err := r.slave.Query(ctx, query, args...)
if err != nil {
    return nil, err
}
defer rows.Close()
  • Можно использовать rows.Err() после цикла для проверки ошибок итерации.

  • Параметры LIMIT и OFFSET обычно идут в порядке LIMIT, OFFSET, но в запросе они указаны как LIMIT $1 OFFSET $2, что соответствует передаче limit, offset — это правильно.

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

Пример с добавлением закрытия rows и проверки ошибок:

rows, err := r.slave.Query(ctx, query, args...)
if err != nil {
    return nil, err
}
defer rows.Close()

for rows.Next() {
    var orderID uint32
    if err = rows.Scan(&orderID); err != nil {
        return nil, err
    }
    res = append(res, orderID)
}

if err = rows.Err(); err != nil {
    return nil, err
}

return res, nil