Skip to content

Instantly share code, notes, and snippets.

@pLogicador
Created November 27, 2024 04:25
Show Gist options
  • Select an option

  • Save pLogicador/de95d5518b752875772e6bdc2956efc2 to your computer and use it in GitHub Desktop.

Select an option

Save pLogicador/de95d5518b752875772e6bdc2956efc2 to your computer and use it in GitHub Desktop.

Paginação em SQL e TypeORM

Conceito

Paginação é uma técnica usada para gerenciar grandes conjuntos de dados em um banco de dados, retornando apenas uma parte dos resultados por vez. Ela é essencial para melhorar o desempenho e a experiência do usuário em aplicações que lidam com grandes volumes de dados.

Como funciona?

  • LIMIT: Define quantos itens serão exibidos por página.
  • OFFSET: Determina quantos itens serão "pulados" antes de começar a exibir os resultados.

Benefícios

  1. Desempenho: Minimiza o impacto no banco de dados, retornando apenas os dados necessários.
  2. Escalabilidade: Evita sobrecarga de consultas em tabelas grandes.
  3. Melhor UX: Facilita a navegação em dados paginados, com respostas rápidas.

Exemplo em SQL

SELECT * 
FROM users
ORDER BY created_at DESC
LIMIT 10 OFFSET 20;
  • LIMIT 10: Mostra 10 registros.
  • OFFSET 20: Pula os 20 primeiros registros e exibe os próximos 10.

Exemplo com TypeORM

DTO para Paginação

import { IsInt, IsOptional, Min } from 'class-validator';

export class PaginationDto {
  @IsOptional()
  @IsInt()
  @Min(1)
  take?: number; // Quantos itens exibir por página (LIMIT)

  @IsOptional()
  @IsInt()
  @Min(0)
  skip?: number; // Quantos itens pular (OFFSET)
}

Service com Paginação

import { Injectable } from '@nestjs/common';
import { Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';
import { PaginationDto } from './dto/pagination.dto';
import { Product } from './entities/product.entity';

@Injectable()
export class ProductsService {
  constructor(
    @InjectRepository(Product)
    private readonly productRepository: Repository<Product>,
  ) {}

  async findAll(paginationDto: PaginationDto) {
    const { take = 10, skip = 0 } = paginationDto; // Valores padrão

    const [results, total] = await this.productRepository.findAndCount({
      take,
      skip,
      order: { name: 'ASC' }, // Ordenação
    });

    return {
      data: results,
      total,
      totalPages: Math.ceil(total / take),
      currentPage: Math.floor(skip / take) + 1,
    };
  }
}

Explicação

  • findAndCount: Retorna os dados e a contagem total de itens da consulta.
  • Paginação simplificada: O DTO encapsula as regras de validação e facilita o uso.
  • Desempenho: Garante que o banco de dados processe apenas o necessário para cada página.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment