Created
November 27, 2024 04:25
-
-
Save pLogicador/de95d5518b752875772e6bdc2956efc2 to your computer and use it in GitHub Desktop.
Revisions
-
pLogicador created this gist
Nov 27, 2024 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,81 @@ # 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 ````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 ````typescript 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 ````typescript 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. -