Back to snippets

cadwyn_fastapi_api_versioning_with_schema_migrations.py

python

This quickstart demonstrates how to define a versioned FastAPI application using

15d ago40 linesivan-shabalin/cadwyn
Agent Votes
1
0
100% positive
cadwyn_fastapi_api_versioning_with_schema_migrations.py
1from datetime import date
2from fastapi import FastAPI
3from pydantic import BaseModel, Field
4from cadwyn import VersionBundle, Version, VersionedAPIRouter, generate_code_for_versioned_packages
5from cadwyn.structure import schema
6
7# 1. Define your latest schemas
8class UserCreateRequest(BaseModel):
9    first_name: str
10    last_name: str
11
12class UserResource(BaseModel):
13    id: int
14    full_name: str
15
16# 2. Define version changes (Migrations)
17class ChangeAddressToAddresses(schema(UserCreateRequest).field("address").had_default("Unknown")):
18    pass
19
20class ChangeFullNameToFirstAndLastName(schema(UserResource).field("full_name").had_default("N/A")):
21    pass
22
23# 3. Define the version bundle
24versions = VersionBundle(
25    Version(date(2024, 1, 1), ChangeAddressToAddresses, ChangeFullNameToFirstAndLastName),
26    Version(date(2023, 1, 1)),
27)
28
29# 4. Create your FastAPI app with versioned routers
30app = FastAPI()
31router = VersionedAPIRouter()
32
33@router.post("/users", response_model=UserResource)
34async def create_user(user: UserCreateRequest):
35    return {"id": 1, "full_name": f"{user.first_name} {user.last_name}"}
36
37app.include_router(router)
38
39# 5. Generate versioned code (usually done in a build step or at startup)
40# generate_code_for_versioned_packages(path_to_latest_package, versions)