Tutorial Terraform para iniciantes: infraestrutura como código do primeiro arquivo aos módulos

  1. Início
  2. Blog
  3. DevOps

DevOps

Tutorial Terraform para iniciantes: Infraestrutura como código do primeiro arquivo aos módulos

Aprenda Terraform sem uma conta na nuvem ou uma conta surpresa. Comece com arquivos locais para entender o plano, a aplicação e o estado e, em seguida, passe para recursos reais da nuvem, módulos e um fluxo de trabalho seguro para as equipes.

10 min de leitura
Tutorial do Terraform para iniciantes: infraestrutura como código do primeiro arquivo aos módulos

Principais pontos

  • O Terraform cria e altera infraestrutura a partir de arquivos de texto que você pode manter no Git.
  • O fluxo de trabalho principal é init, plan, apply e plan mostra as alterações antes que elas aconteçam.
  • O arquivo de estado registra o que o Terraform gerencia. Proteja-o e nunca envie-o para o Git.
  • Use módulos para reutilizar padrões e estado remoto com bloqueio ao trabalhar em equipe.

Clicar em um console de nuvem é adequado para um servidor. Ele falha quando você precisa da mesma configuração na preparação e na produção, ou quando alguém pergunta quem alterou uma regra de firewall em março passado. Este tutorial do Terraform para iniciantes mostra uma maneira melhor: descrever sua infraestrutura em código e deixar uma ferramenta torná-la real.

A maioria dos tutoriais começa com uma conta na nuvem, o que aumenta o risco de cobrança antes que você aprenda alguma coisa. Começamos com o provedor do Terraform local, que apenas cria arquivos no seu computador, então erros não custam nada. Esses exemplos e o resultado da amostra são ilustrações padrão que não executamos para este artigo, e o texto exato varia de acordo com a versão.

O que é Terraforma?

Terraform é uma ferramenta de infraestrutura como código (IaC) da HashiCorp. Você escreve arquivos de configuração em HCL, a linguagem de configuração HashiCorp, descrevendo o resultado final desejado. O Terraform então decide o que criar, alterar ou excluir para chegar lá.

Ele se comunica com plataformas por meio de plug-ins chamados provedores. Existem provedores para AWS, Azure, Google Cloud, Kubernetes, GitHub, Cloudflare e muitos outros, então você pode usar um fluxo de trabalho para todos eles.

Uma coisa a saber: em 2023, a HashiCorp mudou o Terraform para a Business Source License. A comunidade então criou o OpenTofu, um fork de código aberto que usa comandos e configurações muito semelhantes. O que você aprende aqui se aplica amplamente a ambos.

Por que infraestrutura como código?

Pergunta Trabalho manual do console Terraforma
Quem mudou o quê? Difícil de descobrir História do Git
Podemos copiar a preparação para a produção? Clique com cuidado Reutilize o código
O que essa mudança fará? Você descobre depois terraform plan mostra você primeiro
Alguém pode revisá-lo? Não é fácil Uma solicitação pull normal
Recuperação de desastres Depende da memória das pessoas Recrie a partir do código, além de backups de dados

Terraform também é declarativo. Você afirma “deveria haver três servidores”, não “criar um servidor três vezes”. Se já existirem dois, ele adiciona um. Um script que simplesmente repete seus passos pode acabar criando mais três.

Instale o Terraform

Instale-o usando as instruções oficiais da HashiCorp para o seu sistema operacional e confirme se funciona:

terraform -version

Crie uma pasta vazia para o projeto. O Terraform lê cada arquivo .tf na pasta atual, portanto, uma pasta equivale a uma configuração.

Sua primeira configuração

Crie um arquivo chamado main.tf:

terraform {
  required_providers {
    local = {
      source  = "hashicorp/local"
      version = "~> 2.5"
    }
  }
}

resource "local_file" "greeting" {
  filename = "${path.module}/hello.txt"
  content  = "Hello from Terraform\n"
}

Observe o bloco resource, pois quase tudo que você escreve segue esse formato. local_file é o tipo de recurso e greeting é o seu próprio nome dentro da configuração. Juntos, eles formam seu endereço: local_file.greeting. Os argumentos internos descrevem o que você deseja.

O fluxo de trabalho: iniciar, planejar, aplicar

inicialização do terraform

Isso prepara a pasta e baixa os provedores solicitados. Execute-o uma vez no início e novamente sempre que adicionar um provedor ou módulo. Ele também cria um arquivo .terraform.lock.hcl, que registra versões exatas do provedor. Envie esse arquivo para o Git.

terraform init

plano de terraformação

Isso compara seu código com o que existe e mostra as alterações planejadas, sem mexer em nada:

terraform plan

# local_file.greeting will be created
+ resource "local_file" "greeting" {
    + content  = "Hello from Terraform\n"
    + filename = "./hello.txt"
  }

Plan: 1 to add, 0 to change, 0 to destroy.

Aprenda os símbolos, pois você lerá muitos planos:

Símbolo Significado
+ Criar
~ Atualização no local
- Destruir
-/+ Destruir e recriar

aplicar terraform

Isso mostra o plano novamente, pede confirmação e faz as alterações:

terraform apply

Digite yes e hello.txt aparecerá. Agora execute terraform plan novamente. Não deve reportar nenhuma alteração, pois a realidade já corresponde ao seu código. Esta propriedade, onde executá-la repetidamente não causa mais alterações, é chamada de idempotência.

Mudando e destruindo

Edite a linha content e execute terraform plan. Terraform identifica a diferença e propõe uma mudança. Para este recurso, ele substitui o arquivo. Preste atenção às substituições em infraestruturas reais, pois recriar um banco de dados pode significar perda de dados.

Em seguida, exclua hello.txt manualmente e planeje novamente. Terraform percebe que está faltando e se oferece para recriá-lo. Uma diferença entre o seu código e a realidade é chamada de desvio, e detectá-la é um dos principais benefícios da ferramenta.

Para remover tudo o que esta configuração gerencia, execute:

terraform destroy

Variáveis e resultados

Os valores codificados impedem que você reutilize o código. Variáveis de entrada tornam uma configuração flexível e as saídas reportam valores úteis:

# variables.tf
variable "environment" {
  type        = string
  description = "Deployment environment"
  default     = "dev"

  validation {
    condition     = contains(["dev", "staging", "prod"], var.environment)
    error_message = "Use dev, staging or prod."
  }
}

# main.tf
resource "local_file" "config" {
  filename = "${path.module}/${var.environment}.txt"
  content  = "environment=${var.environment}\n"
}

# outputs.tf
output "config_path" {
  value = local_file.config.filename
}

Defina valores na linha de comando ou mantenha-os em um arquivo chamado terraform.tfvars, que é carregado automaticamente:

terraform apply -var="environment=staging"

Usar local_file.config.filename na saída também é como os recursos se referem uns aos outros. O Terraform lê essas referências para descobrir a ordem correta de criação das coisas.

Estado do Terraform

Após a inscrição, você encontrará um arquivo chamado terraform.tfstate. Este é o registro do Terraform sobre o que ele gerencia, mapeando seu código para objetos reais. Sem ele, o Terraform não saberia que local_file.greeting é aquele arquivo específico.

Três regras são importantes aqui:

  1. Nunca confirme o estado no Git. Ele pode conter senhas e outros segredos em texto simples.
  2. Não edite manualmente. Use comandos como terraform state list e terraform state mv.
  3. Use um back-end remoto para projetos de equipe. Um back-end compartilhado armazena o estado centralmente e o bloqueia, de forma que duas pessoas não possam se inscrever ao mesmo tempo.

Aqui está um back-end típico usando Amazon S3, com um bucket que você cria antecipadamente:

terraform {
  backend "s3" {
    bucket       = "my-company-terraform-state"
    key          = "shop/prod/terraform.tfstate"
    region       = "ap-south-1"
    encrypt      = true
    use_lockfile = true
  }
}

Dica: Comece cada projeto com um .gitignore que exclui .terraform/, *.tfstate, *.tfstate.* e quaisquer *.tfvars arquivos que contenham segredos.

Um verdadeiro recurso de nuvem

O fluxo de trabalho não muda quando você muda para uma nuvem. Aqui está um bucket S3 na AWS. Verifique primeiro os preços e destrua tudo o que você criar enquanto pratica:

provider "aws" {
  region = "ap-south-1"
}

resource "aws_s3_bucket" "reports" {
  bucket = "my-unique-reports-bucket-2026"

  tags = {
    Environment = var.environment
    ManagedBy   = "terraform"
  }
}

O Terraform obtém credenciais da configuração da AWS CLI ou de variáveis de ambiente. Nunca escreva chaves de acesso em um arquivo .tf.

Módulos

Um módulo é simplesmente uma pasta de arquivos Terraform que você pode chamar com diferentes entradas. Funciona como uma função, permitindo definir um padrão uma vez e reutilizá-lo:

project/
  main.tf
  modules/
    reports_bucket/
      main.tf
      variables.tf
      outputs.tf
module "staging_reports" {
  source      = "./modules/reports_bucket"
  environment = "staging"
}

module "prod_reports" {
  source      = "./modules/reports_bucket"
  environment = "prod"
}

O Terraform Registry público também possui módulos prontos, mas leia-os antes de confiar neles e fixe a versão. Não construa módulos muito cedo. Espere até ter repetido um padrão pelo menos duas vezes.

Um fluxo de trabalho de equipe seguro

  1. Crie uma ramificação e altere os arquivos .tf. Consulte nosso tutorial do Git para iniciantes se precisar de uma atualização.
  2. Execute terraform fmt e terraform validate.
  3. Abra uma solicitação pull, com a saída de terraform plan anexada para revisão.
  4. Após a aprovação, aplique o plano salvo em um local controlado, de preferência um pipeline.

Salvar o plano garante que você aplique exatamente o que foi revisado:

terraform plan -out=tfplan
terraform apply tfplan

Isso se encaixa naturalmente em CI/CD e GitHub Actions. O Terraform geralmente provisiona o cluster, e ferramentas como o Kubernetes executam aplicativos sobre ele.

Erros comuns

  • Inscrever-se sem ler o plano. Um -/+ em um banco de dados pode ser uma surpresa muito cara.
  • Manter o estado em um laptop. Perca esse laptop e o Terraform perderá o controle de sua infraestrutura.
  • Fazendo alterações manuais no console. Elas causam desvios e a próxima aplicação pode desfazê-las.
  • Usando versões não fixadas. Fixe as versões do provedor e do módulo para que as atualizações aconteçam propositalmente.
  • Usar uma configuração enorme. A divisão por ambiente ou sistema limita os danos de qualquer erro.

Considerações finais

Você já viu as ideias por trás de quase todo o trabalho do Terraform: declarar recursos, revisar o plano, aplicá-lo e proteger o estado. Pratique com o provedor local até que o fluxo de trabalho pareça natural e, em seguida, gerencie um pequeno recurso real em uma conta de nível gratuito. Traga estados e módulos remotos quando mais de uma pessoa ou mais de um ambiente estiver envolvido.

Perguntas frequentes

Para que é usado o Terraform?

O Terraform é usado para criar e gerenciar infraestruturas, como servidores, redes, bancos de dados e DNS, descrevendo-as em código em vez de configurá-las manualmente.

O Terraform é gratuito?

O uso da CLI do Terraform é gratuito sob sua licença de origem comercial, embora os termos restrinjam alguns usos comerciais concorrentes. O HCP Terraform tem níveis pagos e o OpenTofu é de código aberto.

Qual é a diferença entre Terraform e Ansible?

O Terraform provisiona principalmente a infraestrutura de forma declarativa. O Ansible configura software principalmente em máquinas existentes. Muitas equipes usam ambos, primeiro o Terraform e depois o Ansible.

O que é um arquivo de estado do Terraform?

É um registro que mapeia sua configuração para recursos reais. O Terraform o usa para realizar mudanças. Ele pode conter segredos, portanto armazene-o com segurança e mantenha-o fora do Git.

Preciso saber programação para aprender Terraform?

Na verdade. HCL é simples e declarativa. Compreender a plataforma que você gerencia, como a rede AWS, geralmente é mais difícil do que a própria linguagem.

Continue aprendendo

Trabalhe com Stack Quora

Precisa de ajuda com testes, WordPress ou SEO?

Ajudamos as equipes a fornecer software melhor e a expandir seus sites. Conte-nos no que você está trabalhando e sugeriremos um próximo passo claro.

Continue lendo

Mais guias sobre testes, IA e desenvolvimento moderno

Gostou deste artigo? Escolha um tópico e vá direto para nossos tutoriais mais recentes.

Inteligência artificial

Explicação das alucinações de IA: por que os modelos de linguagem inventam as coisas e como reduzi-las

Explicação das alucinações de IA: o que são, por que os modelos de linguagem as produzem, tipos comuns, como reduzi-las com aterramento e instruções…

Leia o artigo →
DevOps

Variáveis de ambiente explicadas: arquivos .env, segredos e configuração bem feitos

Variáveis de ambiente explicadas com exemplos de Python que executamos: leitura e configuração, por que cada valor é uma string, arquivos .env, hera…

Leia o artigo →
Desenvolvimento de software

Explicação da limitação de taxa de API: algoritmos, cabeçalhos e tratamento de erros 429

Limitação de taxa de API explicada com uma simulação que executamos: token bucket, janela fixa, janela deslizante, 429 respostas, cabeçalhos de limi…

Leia o artigo →
Automação de testes

Zombando em Python: unittest.mock, patch e os erros que fazem os testes mentirem

Zombaria em Python com unittest.mock, testado: Mock e return_value, side_effect, patch onde um nome é usado, especificação e autospec, zombaria de d…

Leia o artigo →
Teste de software

Cobertura de código explicada: cobertura de linha versus filial e o que 100% realmente significa

Cobertura de código explicada com uma execução cobertura.py real: cobertura de linha, ramal e condição, leitura de um relatório, por que 100% de cob…

Leia o artigo →
Bancos de dados e SQL

DELETE vs TRUNCATE vs DROP em SQL: diferenças, reversão e quando usar cada um

DELETE vs TRUNCATE vs DROP explicado com SQL testado: o que cada um remove, rollback, aciona, redefinição de identidade, velocidade e como PostgreSQ…

Leia o artigo →
Bancos de dados e SQL

Exibições SQL explicadas: crie, use e evite as armadilhas, com exemplos

Visualizações SQL explicadas com consultas que executamos: criação de uma visualização, resultados ao vivo, ocultação de colunas, desempenho, visual…

Leia o artigo →
Desenvolvimento de software

Interface TypeScript vs tipo: diferenças reais, testadas com o compilador

Interface TypeScript versus tipo, verificada com o compilador real: o que ambos podem fazer, o que apenas um pode fazer, mesclagem de declarações, e…

Leia o artigo →
Desenvolvimento de software

Python *args e **kwargs explicados: funções flexíveis com exemplos claros

Python *args e **kwargs explicados com o código que executamos: empacotamento e descompactação, ordem dos parâmetros, argumentos somente de palavras…

Leia o artigo →
Desenvolvimento de software

Funções Python Lambda: sintaxe, usos reais e quando não usá-los

Funções lambda do Python explicadas com o código que executamos: sintaxe, classificação com chave, mapa e filtro, fechamentos, armadilha de ligação …

Leia o artigo →
Inteligência artificial

O que são agentes de IA? Como eles funcionam, com um loop de agente simples que você pode executar

O que são agentes de IA? Um guia simples para o loop do agente, ferramentas, memória e proteções, com um pequeno loop Python que executamos, riscos …

Leia o artigo →
DevOps

Monitoramento versus observabilidade: a verdadeira diferença, com logs, métricas e rastreamentos

Explicação do monitoramento versus observabilidade: falhas conhecidas e desconhecidas, logs, métricas e rastreamentos, um passo a passo do incidente…

Leia o artigo →
DevOps

Docker Volumes vs Bind Mounts: persista os dados do contêiner da maneira certa

Volumes Docker versus montagens de ligação explicadas: por que os dados do contêiner desaparecem, volumes nomeados, montagens de ligação, tmpfs, exe…

Leia o artigo →
Automação de testes

TDD vs BDD: principais diferenças, um recurso criado de ambas as maneiras e quando usar cada um

TDD vs BDD explicado com um recurso de desconto construído em ambos os sentidos: refatoração vermelho-verde com o código que executamos, cenários da…

Leia o artigo →
Teste de software

Teste de aceitação do usuário (UAT): processo, lista de verificação e exemplos reais

Explicação do teste de aceitação do usuário: quem o executa, como ele difere do controle de qualidade, um processo de sete etapas, um modelo de caso…

Leia o artigo →
Bancos de dados e SQL

Valores SQL NULL explicados: IS NULL, COALESCE, NULLIF e as armadilhas a serem evitadas

Valores SQL NULL explicados com consultas que executamos: lógica de três valores, IS NULL, COALESCE, NULLIF, como agregações, junções e classificaçã…

Leia o artigo →
Bancos de dados e SQL

Instrução SQL CASE WHEN: sintaxe, exemplos reais e erros comuns

SQL CASE WHEN explicado com consultas que executamos: formulários simples e pesquisados, ordem de condição, pivôs com SUM, truques COUNT, classifica…

Leia o artigo →
Desenvolvimento de software

O que é JWT? JSON Web Tokens explicados com um exemplo prático

O que é JWT? JSON Web Tokens explicados: as três partes, um token construído e adulterado no código que executamos, JWT vs sessões, armazenamento, t…

Leia o artigo →
Desenvolvimento de software

Loop de eventos JavaScript explicado: pilha de chamadas, microtarefas e temporizadores com exemplos

O loop de eventos JavaScript explicado com o código que executamos: pilha de chamadas, filas de tarefas e microtarefas, por que setTimeout 0 não é i…

Leia o artigo →
Desenvolvimento de software

Geradores Python e rendimento explicado: economize memória com exemplos reais

Geradores Python e rendimento explicados com o código que executamos: como eles pausam e reiniciam, medem economia de memória, pipelines, sequências…

Leia o artigo →
Inteligência artificial

O que são incorporações? Similaridade de vetores e cossenos explicada de forma simples

O que são incorporações? Um guia em linguagem simples para vetores, similaridade de cossenos e pesquisa semântica, com um pequeno exemplo que execut…

Leia o artigo →
DevOps

Implantação azul-verde vs canário: diferenças, compensações e como escolher

Explicação da implantação azul-verde versus canário: como cada um funciona, custo, risco e reversão, agrupamento estável de usuários que testamos, m…

Leia o artigo →
Automação de testes

Testes instáveis: o que os causa e como corrigi-los para sempre

Testes instáveis explicados com demonstrações que executamos: as principais causas, como confirmar e diagnosticar uma, soluções adequadas para tempo…

Leia o artigo →
Teste de software

Teste de carga versus teste de estresse: diferenças, métricas e exemplos k6

Teste de carga versus teste de estresse explicado: o que cada um prova, testes de pico e absorção, as métricas que importam, por que as médias engan…

Leia o artigo →
Teste de software

Caso de teste versus cenário de teste: principais diferenças, exemplos e quando usar cada um

Caso de teste vs cenário de teste explicado: definições claras, uma tabela lado a lado, um recurso de redefinição de senha retirado de cenários para…

Leia o artigo →
Bancos de dados e SQL

Otimização de consultas SQL: leia planos de execução e corrija consultas lentas, com intervalos

Otimização de consulta SQL testada em um milhão de linhas: leia planos de execução, adicione os índices corretos, corrija filtros não sargáveis, use…

Leia o artigo →
Bancos de dados e SQL

SQL UNION vs UNION ALL: diferenças, exemplos e desempenho testado

SQL UNION vs UNION ALL explicado com consultas que executamos: duplicatas, as regras que ambos seguem, um bug de dados real, desempenho medido, INTE…

Leia o artigo →
Desenvolvimento de software

Tutorial da API JavaScript Fetch: GET, POST, tratamento de erros e tempos limite

Um tutorial da API JavaScript Fetch testado em um servidor local: GET e POST, por que 404 não lança, um auxiliar reutilizável, strings de consulta, …

Leia o artigo →
Desenvolvimento de software

Manipulação de arquivos Python: leitura, gravação, CSV, JSON e pathlib com exemplos

Manipulação de arquivos Python explicada com código que executamos: modos abertos, com, leitura de arquivos grandes, CSV, JSON, pathlib, arquivos bi…

Leia o artigo →
Desenvolvimento de software

Classes e objetos Python: tutorial OOP com exemplos reais

Classes e objetos Python explicados com código que executamos: __init__, métodos, atributos de classe vs instância, herança, propriedades, métodos d…

Leia o artigo →
Inteligência artificial

O que é um modelo de linguagem grande? Como funcionam os LLMs, explicado sem exageros

O que é um modelo de linguagem grande? LLMs explicados em linguagem simples: tokens, incorporações, atenção, treinamento, temperatura e janelas de c…

Leia o artigo →
DevOps

Comandos Linux para iniciantes: o guia essencial do terminal com exemplos

Comandos Linux para iniciantes, agrupados por tarefa: navegação, arquivos, visualização de logs, grep, pipes, permissões, processos e arquivos, com …

Leia o artigo →
Automação de testes

Selenium vs Playwright: principais diferenças, código comparado e qual escolher

Selenium vs Playwright comparado: arquitetura, espera, suporte a navegador e linguagem, depuração, o mesmo teste em ambas as ferramentas, conselhos …

Leia o artigo →
Teste de software

Particionamento de equivalência: técnica de design de teste explicada com exemplos resolvidos

Explicação do particionamento de equivalência: como encontrar partições válidas e inválidas, exemplos resolvidos para idades, senhas e cupons, teste…

Leia o artigo →
Teste de software

Gravidade vs Prioridade em Testes de Software: Diferenças, Matriz e Exemplos Reais

Explicação da gravidade versus prioridade em testes de software: definições claras, uma matriz de quatro vias com exemplos, escalas de nível, quem d…

Leia o artigo →
Bancos de dados e SQL

Tutorial de subconsultas SQL: tipos, subconsultas correlacionadas e EXISTS com exemplos

Um tutorial de subconsultas SQL com consultas que executamos: subconsultas escalares, IN, FROM e SELECT, subconsultas correlacionadas, EXISTS, a arm…

Leia o artigo →
Bancos de dados e SQL

Transações SQL e ACID explicados: COMMIT, ROLLBACK e níveis de isolamento

Transações SQL e ACID explicadas com uma transferência bancária que executamos: COMMIT, ROLLBACK, savepoints, locks, níveis de isolamento, leituras …

Leia o artigo →
Desenvolvimento de software

Folha de dicas dos comandos do Git: os comandos que você realmente usa, com exemplos

Uma folha de dicas de comandos Git agrupada por tarefa: configuração, preparação, ramificações, controles remotos, stash, histórico e desfazer erros…

Leia o artigo →
Desenvolvimento de software

Explicação das promessas de JavaScript: então, catch, Promise.all e erros comuns

Promessas JavaScript explicadas com o código que executamos: estados, cadeias then e catch, tratamento de erros, Promise.all, allSettled, race e any…

Leia o artigo →
Desenvolvimento de software

Tutorial do dicionário Python: métodos, exemplos e padrões comuns

Um tutorial de dicionário Python com código que executamos: criar, ler e atualizar dictos, métodos-chave, mesclagem, compreensão, padrões de contage…

Leia o artigo →
Inteligência artificial

O que é RAG? Geração aumentada de recuperação explicada com um exemplo prático

O que é RAG? Geração aumentada de recuperação explicada passo a passo: indexação, chunking, embeddings, recuperação, um pequeno exemplo funcional de…

Leia o artigo →
DevOps

Tutorial Terraform para iniciantes: infraestrutura como código do primeiro arquivo aos módulos

Um tutorial do Terraform para iniciantes: comece sem conta na nuvem, aprenda como iniciar, planejar e aplicar, depois variáveis, saídas, estado, mód…

Leia o artigo →
DevOps

Docker vs Kubernetes: principais diferenças, como eles funcionam juntos e o que você precisa

Docker vs Kubernetes explicado: o que cada um faz, o mesmo aplicativo rodando com ambos, Docker Compose e Swarm comparados, a mudança do dockershim …

Leia o artigo →
Automação de testes

Tutorial Pytest para iniciantes: luminárias, parametrização e exemplos reais

Um tutorial pytest para iniciantes com testes que executamos no pytest 9.2: asserções, fixtures, parametrizar, conftest, marcadores, tmp_path, monke…

Leia o artigo →
Teste de software

Ciclo de vida de teste de software (STLC): 6 fases, critérios de entrada e saída, exemplo

O ciclo de vida de teste de software explicou: seis fases do STLC com critérios de entrada e saída, resultados, um exemplo de recurso de login funci…

Leia o artigo →
Desenvolvimento de software

Git merge vs rebase: diferenças, exemplos e quando usar cada um

Git merge vs rebase explicado com saída real do log, uma tabela comparativa, a regra de ouro do rebase e um fluxo de trabalho seguro para equipes.

Leia o artigo →
Desenvolvimento de software

List comprehension em Python: sintaxe, exemplos e quando evitar

List comprehension em Python explicada: sintaxe, filtros, if-else, laços aninhados, tempos medidos e quando um laço for comum é a melhor escolha.

Leia o artigo →
Bancos de dados e SQL

SQL JOIN explicado com exemplos (Inner, Left, Right, Full)

Entenda os joins SQL passo a passo com tabelas e consultas de exemplo: INNER, LEFT, RIGHT, FULL, CROSS e SELF, além de erros comuns e dicas de desem…

Leia o artigo →