Skip to content
On this page

Pydantic Models

python

Generate Pydantic BaseModel classes with Field validators from SQL schema

Example Output ​

Generated from the pet-store sample schema:

python
# Generated by @sqldoc/templates/pydantic -- DO NOT EDIT

from pydantic import BaseModel, Field
from typing import Optional
from datetime import date
from datetime import datetime
from decimal import Decimal


class Adoption(BaseModel):
    id: int
    pet_id: int
    owner_id: int
    adopted_at: datetime
    adoption_fee: Decimal


class AdoptionsAuditLog(BaseModel):
    id: int
    table_name: str
    operation: str
    changed_at: datetime
    old_data: Optional[dict] = None
    new_data: Optional[dict] = None


class Category(BaseModel):
    id: int
    name: str = Field(min_length=1)
    description: Optional[str] = None


class LegacyInventory(BaseModel):
    id: int
    item_name: Optional[str] = None
    old_sku: Optional[str] = None
    quantity: Optional[int] = None


class Location(BaseModel):
    id: int
    name: str
    address: str
    city: str
    zip: Optional[str] = None


class MedicalRecord(BaseModel):
    id: int
    pet_id: int
    visit_date: date
    diagnosis: str
    treatment: Optional[str] = None
    vet_name: Optional[str] = None


class Owner(BaseModel):
    id: int
    name: str = Field(min_length=1)
    email: str = Field(pattern='^[^@]+@[^@]+\.[^@]+$')
    phone: Optional[str] = Field(default=None, min_length=7, max_length=20)
    created_at: Optional[datetime] = None


class Pet(BaseModel):
    id: int
    name: str = Field(min_length=1)
    sku: str = Field(pattern='^[A-Z]{3}-[0-9]{4}$')
    price: Decimal = Field(ge=0, le=99999)
    status: str
    category_id: Optional[int] = None
    internal_notes: Optional[str] = None
    created_at: Optional[datetime] = None


class Review(BaseModel):
    id: int
    pet_id: int
    owner_id: int
    rating: int = Field(ge=1, le=5)
    body: Optional[str] = None
    location_id: Optional[int] = None
    created_at: Optional[datetime] = None


class StaffAuditLog(BaseModel):
    id: int
    table_name: str
    operation: str
    changed_at: datetime
    old_data: Optional[dict] = None
    new_data: Optional[dict] = None

Usage ​

Add to your sqldoc.config.ts:

typescript
export default {
  dialect: 'postgres',
  schema: ['./schema.sql'],
  codegen: [
    {
      template: 'pydantic',
      output: './generated/models.py',
    },
  ],
}

Then run:

bash
sqldoc codegen