ANÚNCIO

~/questoes/programacao

Qual é uma boa prática ao trabalhar com sessões de banco em FastAPI?

Responda, confira o feedback e use o resultado para orientar sua revisão.
Aula de referência FastAPI: Banco de Dados, Modelos e Migrações
Para fixar

Gerenciamento de Sessões em FastAPI: Dependency Injection na Prática

Conceito central

Em FastAPI, a forma como você gerencia sessões de banco de dados impacta diretamente na segurança, isolamento de dados e facilidade de testes. O padrão correto é usar dependency injection para fornecer uma sessão fresca a cada requisição, evitando problemas de concorrência e vazamento de estado entre usuários.

Por que essa resposta faz sentido

Usar dependency injection para fornecer uma sessão limpa a cada requisição garante isolamento total entre requisições — cada usuário trabalha com sua própria instância de sessão. Isso evita condições de corrida, facilita testes unitários e mantém o código limpo e manutenível.

Armadilhas comuns

  • Acreditar que uma variável global salva performance — na verdade, reduz drasticamente porque cria contenção e deadlocks entre requisições paralelas.
  • Confundir 'reutilizar a mesma sessão' com 'usar dependency injection' — reutilizar é feito automaticamente pelo FastAPI através de pools de conexão; você não precisa (e não deve) gerenciar manualmente.
  • Tentar fechar a sessão manualmente depois da resposta, causando erros de timing e vazamento de recursos quando exceções ocorrem.

Entenda as alternativas

A

Variáveis globais compartilhadas causam sérios problemas: múltiplas requisições simultâneas competem pela mesma sessão, gerando race conditions. Além disso, dados de um usuário podem vazar para outro, e testes se tornam impredíveis porque compartilham estado.

B

Abrir e fechar sessões manualmente dentro de cada função é repetitivo e propenso a erros. Se você esquecer de fechar, recursos vazam. Também fica difícil de testar e viola o princípio de responsabilidade única — a rota se preocupa tanto com lógica quanto com gerenciamento de conexão.

C

Manter a sessão aberta durante toda execução é perigoso: a memória cresce indefinidamente, conexões ficam ocupadas, e todas as requisições compartilham o mesmo contexto. Em produção, isso causa travamentos e comportamentos imprevisíveis.

D

Dependency injection fornece uma sessão nova a cada requisição de forma automática e elegante. FastAPI injeta a sessão nos parâmetros da função, elimina boilerplate repetitivo e torna testes simples — você pode injetar uma sessão fake sem modificar a rota.

Dica prática: Na prática, use um padrão como: crie uma função `get_db()` com `@app.dependency` que abre uma sessão e a fecha automaticamente. FastAPI chama isso para cada rota que declarar `db: Session = Depends(get_db)`. Assim você tem isolamento garantido sem escrever try/finally em cada rota.

Revise pensando: Por que injetar uma sessão nova a cada requisição é melhor do que compartilhar uma global, mesmo que pareça menos eficiente?