Endpoints CRUD em FastAPI com Pydantic v2, Alembic e testes pytest
Gere um módulo FastAPI completo para um recurso: esquemas Pydantic v2, modelo e migração Alembic, router CRUD paginado e testes pytest com httpx. Pensado para ChatGPT, Claude, Gemini e Microsoft Copilot. Inclui 5 variáveis personalizáveis e pode copiá-lo gratuitamente com um clique.
Intermédio · Código · Pendente de revisão editorial
Prompt
Atua como programador backend sénior especializado em Python, FastAPI e SQLAlchemy.
Quero acrescentar a uma API FastAPI existente um módulo completo para gerir {{recurso}}.
- Campos e tipos: {{campos}}
- Regras de negócio: {{regras}}
- Base de dados: {{base_dados}}
- Acesso a dados: {{acesso}}
Entregáveis, por esta ordem:
1. Estrutura de ficheiros (router, esquemas, modelo, serviço ou repositório, testes) com uma frase a justificar a divisão.
2. Esquemas Pydantic v2 separados para criar, atualizar parcialmente e responder, com validações (`Field`, `field_validator`, `model_validator`) que apliquem as regras de negócio.
3. O modelo da base de dados e a respetiva migração Alembic, com índices e restrições de unicidade onde fizer sentido.
4. Um router com listagem paginada e filtrável, detalhe, criação, atualização parcial (PATCH) e eliminação. Usa os códigos corretos (201, 204, 404, 409, 422) e `response_model` em todos os endpoints.
5. Sessão da base de dados injetada com `Depends`, sem estado global e com transações bem delimitadas.
6. Testes com pytest e `httpx.AsyncClient` (ou `TestClient` se o acesso for síncrono): caso feliz, validação, recurso inexistente e conflito com uma regra de negócio, numa base de dados de teste isolada.
7. Comandos para arrancar a aplicação, aplicar a migração e correr os testes.
Restrições:
- Python 3.11 ou superior, tudo tipado, sem dependências desnecessárias.
- Não inventes campos nem regras: se algo for ambíguo, pergunta-me antes de escrever código ou marca como [PREENCHER].
- Indica que decisões dependem do resto do meu projeto (autenticação, configuração, nomes das tabelas).
Formato: um bloco de código por ficheiro com o caminho como título e, no fim, uma lista de pressupostos.Como utilizar
- Descreve o recurso com os campos reais e as regras que hoje verificas à mão.
- Escolhe a base de dados e o modo de acesso (SQLAlchemy assíncrono, síncrono ou SQLModel).
- Copia os ficheiros, gera a migração e corre
pytestantes de integrar. - Se o projeto já tem convenções de pastas, cola-as para o código as respeitar.
Exemplo de utilização
Recurso: reservas de mesa · Campos: cliente, data e hora, número de pessoas · Regra: máximo de 40 pessoas por intervalo · PostgreSQL com SQLAlchemy assíncrono.
Exemplo de resultado
2. Esquemas Pydantic v2 — app/reservas/schemas.py
from datetime import datetime, timedelta, timezone
from enum import Enum
from pydantic import BaseModel, Field, field_validator
class EstadoReserva(str, Enum):
pendente = "pendente"
confirmada = "confirmada"
cancelada = "cancelada"
class ReservaCreate(BaseModel):
nome_cliente: str = Field(min_length=1, max_length=120)
telemovel: str = Field(pattern=r"^\+?[0-9 ]{7,20}$")
data_hora: datetime
pessoas: int = Field(ge=1, le=12)
@field_validator("data_hora")
@classmethod
def dentro_da_janela(cls, v: datetime) -> datetime:
if v.tzinfo is None:
raise ValueError("a data tem de incluir fuso horário")
agora = datetime.now(timezone.utc)
if v < agora or v > agora + timedelta(days=60):
raise ValueError("só se aceitam reservas entre hoje e 60 dias")
return v
class ReservaUpdate(BaseModel):
data_hora: datetime | None = None
pessoas: int | None = Field(default=None, ge=1, le=12)
estado: EstadoReserva | None = None
Este limite de 40 pessoas por intervalo de 30 minutos precisa de consultar a base de dados, por isso não fica no esquema: o serviço soma as pessoas do intervalo na mesma transação e devolve 409 se o limite for ultrapassado.
Pressupostos
- Os intervalos começam às :00 e às :30 → [COMPLETAR] se o restaurante funcionar de outra forma.
- O formato do telemóvel é indicativo…
Dados-chave
- Categoria
- Programação e desenvolvimento · Python
- Tipo de resultado
- Código
- Nível
- Intermédio
- Pensado para
- ChatGPT, Claude, Gemini e Microsoft Copilot
- Verificado em
- Pendente de verificação editorial
- Variáveis
- Recurso, Campos e tipos, Regras de negócio, Base de dados e Acesso a dados
- Idioma
- Português
- Preço
- Gratuito, sem registo
- Atualizado
- 07/11/2026
Perguntas frequentes
Porquê três esquemas Pydantic para o mesmo recurso?
Criar, atualizar e responder exigem campos diferentes: no PATCH tudo é opcional e a resposta inclui id e datas. Separá-los evita expor campos internos.
As regras de negócio ficam no esquema ou no serviço?
As verificações de formato e intervalo ficam no Pydantic. As que precisam de consultar a base de dados, como a lotação de um intervalo, ficam no serviço e devolvem 409 em caso de conflito.
Funciona com SQLModel?
Sim. Escolhe SQLModel na variável de acesso a dados e o prompt adapta modelos e esquemas, mantendo entrada e saída separadas.
Para que serve este prompt?
Gere um módulo FastAPI completo para um recurso: esquemas Pydantic v2, modelo e migração Alembic, router CRUD paginado e testes pytest com httpx.
Com que ferramentas de IA funciona?
Foi pensado para ChatGPT, Claude, Gemini e Microsoft Copilot. Ainda não o verificámos nestas ferramentas, pelo que os resultados podem variar entre elas.
Como personalizo o prompt?
Clique em “Personalizar” e preencha as variáveis (Recurso, Campos e tipos, Regras de negócio, Base de dados e Acesso a dados). O texto atualiza-se instantaneamente e pode depois copiá-lo com um clique. Os valores ficam guardados apenas no seu navegador.
Preciso de experiência para o utilizar?
É de nível intermédio: convém conhecer o tema para fornecer bom contexto e rever o resultado com sentido crítico.
Este prompt é gratuito?
Sim. Todos os prompts do HomeCasa Prompts são gratuitos, sem registo nem subscrição. Pode também utilizá-los em projetos profissionais.
Posso confiar no resultado da IA?
Trate-o como um rascunho de qualidade: verifique sempre os dados, os números e as afirmações importantes antes de publicar ou tomar decisões.