Endpoint CRUD in FastAPI con Pydantic v2, Alembic e test pytest
Genera un modulo FastAPI completo per una risorsa: schemi Pydantic v2, modello e migrazione Alembic, router CRUD paginato e test pytest con httpx. Pensato per ChatGPT, Claude, Gemini e Microsoft Copilot. Include 5 variabili personalizzabili e puoi copiarlo gratuitamente con un clic.
Intermedio · Codice · In attesa di revisione editoriale
Prompt
Agisci come sviluppatore backend senior specializzato in Python, FastAPI e SQLAlchemy.
Voglio aggiungere a un’API FastAPI esistente un modulo completo per gestire {{risorsa}}.
- Campi e tipi: {{campi}}
- Regole di business: {{regole}}
- Database: {{database}}
- Accesso ai dati: {{accesso}}
Consegna, in quest’ordine:
1. La struttura dei file (router, schemi, modello, service o repository, test) con una frase che giustifichi la suddivisione.
2. Schemi Pydantic v2 separati per creazione, aggiornamento parziale e risposta, con validazioni (`Field`, `field_validator`, `model_validator`) che applichino le regole di business.
3. Il modello del database e la relativa migrazione Alembic, con indici e vincoli di unicità dove servono.
4. Un router con elenco paginato e filtrabile, dettaglio, creazione, aggiornamento parziale (PATCH) ed eliminazione. Usa i codici corretti (201, 204, 404, 409, 422) e un `response_model` su ogni endpoint.
5. La sessione del database iniettata con `Depends`, senza stato globale e con transazioni ben delimitate.
6. Test con pytest e `httpx.AsyncClient` (o `TestClient` se l’accesso è sincrono): caso felice, validazione, risorsa inesistente e conflitto con una regola di business, su un database di test isolato.
7. I comandi per avviare l’app, applicare la migrazione ed eseguire i test.
Vincoli:
- Python 3.11 o superiore, tutto tipizzato, nessuna dipendenza superflua.
- Non inventare campi né regole: se qualcosa è ambiguo, chiedimelo prima di scrivere codice o segnalo con [DA COMPLETARE].
- Indica quali decisioni dipendono dal resto del mio progetto (autenticazione, configurazione, nomi delle tabelle).
Formato: un blocco di codice per file con il percorso come titolo e, alla fine, l’elenco delle ipotesi.Come usarlo
- Descrivi la risorsa con i campi reali e le regole che oggi controlli a mano.
- Scegli il database e la modalità di accesso (SQLAlchemy asincrono, sincrono o SQLModel).
- Copia i file, genera la migrazione ed esegui
pytestprima di integrare. - Se il progetto ha già convenzioni per le cartelle, incollale perché il codice le rispetti.
Esempio d'uso
Risorsa: prenotazioni dei tavoli · Campi: cliente, data e ora, coperti · Regola: massimo 40 coperti per fascia · PostgreSQL con SQLAlchemy asincrono.
Esempio di risultato
2. Schemi Pydantic v2 — app/prenotazioni/schemas.py
from datetime import datetime, timedelta, timezone
from enum import Enum
from pydantic import BaseModel, Field, field_validator
class StatoPrenotazione(str, Enum):
in_attesa = "in_attesa"
confermata = "confermata"
annullata = "annullata"
class PrenotazioneCreate(BaseModel):
nome_cliente: str = Field(min_length=1, max_length=120)
telefono: str = Field(pattern=r"^\+?[0-9 ]{7,20}$")
data_ora: datetime
coperti: int = Field(ge=1, le=12)
@field_validator("data_ora")
@classmethod
def nella_finestra(cls, v: datetime) -> datetime:
if v.tzinfo is None:
raise ValueError("la data deve includere il fuso orario")
adesso = datetime.now(timezone.utc)
if v < adesso or v > adesso + timedelta(days=60):
raise ValueError("prenotazioni ammesse solo da oggi a 60 giorni")
return v
class PrenotazioneUpdate(BaseModel):
data_ora: datetime | None = None
coperti: int | None = Field(default=None, ge=1, le=12)
stato: StatoPrenotazione | None = None
Il limite di 40 coperti per fascia di 30 minuti richiede una query sul database, quindi non va nello schema: il servizio somma i coperti della fascia nella stessa transazione e risponde 409 se il limite viene superato.
Assunzioni
- Le fasce iniziano a :00 e :30 → [DA COMPLETARE] se il ristorante usa un altro criterio.
- Il formato del telefono è indicativo…
Dati chiave
- Categoria
- Programmazione e sviluppo · Python
- Tipo di output
- Codice
- Livello
- Intermedio
- Pensato per
- ChatGPT, Claude, Gemini e Microsoft Copilot
- Verificato in
- In attesa di verifica editoriale
- Variabili
- Risorsa, Campi e tipi, Regole di business, Database e Accesso ai dati
- Lingua
- Italiano
- Prezzo
- Gratuito, senza registrazione
- Aggiornato
- 07/11/2026
Domande frequenti
Perché tre schemi Pydantic per la stessa risorsa?
Creazione, aggiornamento e risposta richiedono campi diversi: nel PATCH tutto è opzionale e la risposta include id e date. Separarli evita di esporre campi interni.
Le regole di business vanno nello schema o nel service?
I controlli di formato e intervallo vanno in Pydantic. Quelle che richiedono una query, come la capienza di una fascia oraria, vanno nel service e restituiscono 409 in caso di conflitto.
Funziona anche con SQLModel?
Sì. Seleziona SQLModel nella variabile di accesso ai dati: il prompt adatta modelli e schemi mantenendo separati input e output.
A cosa serve questo prompt?
Genera un modulo FastAPI completo per una risorsa: schemi Pydantic v2, modello e migrazione Alembic, router CRUD paginato e test pytest con httpx.
Con quali strumenti di IA funziona?
È pensato per ChatGPT, Claude, Gemini e Microsoft Copilot. Non lo abbiamo ancora verificato in questi strumenti, quindi i risultati possono variare da uno all'altro.
Come personalizzo il prompt?
Clicca su «Personalizza» e compila le variabili (Risorsa, Campi e tipi, Regole di business, Database e Accesso ai dati). Il testo si aggiorna all'istante e poi puoi copiarlo con un clic. I valori vengono salvati solo nel tuo browser.
Serve esperienza per usarlo?
È di livello intermedio: conviene conoscere l'argomento per fornire un buon contesto e valutare il risultato con occhio critico.
Questo prompt è gratuito?
Sì. Tutti i prompt di HomeCasa Prompts sono gratuiti, senza registrazione né abbonamento. Puoi usarli anche in progetti professionali.
Posso fidarmi dell'output dell'IA?
Consideralo una bozza di alta qualità: verifica sempre dati, cifre e affermazioni importanti prima di pubblicare o prendere decisioni.