Pydantic-SQLAlchemy
Tools to generate Pydantic models from SQLAlchemy models, forked from pydantic-sqlalchemy
Quick example:
from typing import List from pyd_sqa import pyd_sqa from sqlalchemy import Column, ForeignKey, Integer, String, create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import Session, relationship, sessionmaker Base = declarative_base() engine = create_engine("sqlite://", echo=True) class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) name = Column(String) fullname = Column(String) nickname = Column(String) addresses = relationship( "Address", back_populates="user", cascade="all, delete, delete-orphan" ) class Address(Base): __tablename__ = "addresses" id = Column(Integer, primary_key=True) email_address = Column(String, nullable=False) user_id = Column(Integer, ForeignKey("users.id")) user = relationship("User", back_populates="addresses") PydanticUser = pyd_sqa(User) PydanticAddress = pyd_sqa(Address) class PydanticUserWithAddresses(PydanticUser): addresses: List[PydanticAddress] = [] Base.metadata.create_all(engine) LocalSession = sessionmaker(bind=engine) db: Session = LocalSession() ed_user = User(name="ed", fullname="Ed Jones", nickname="edsnickname") address = Address(email_address="ed@example.com") address2 = Address(email_address="eddy@example.com") ed_user.addresses = [address, address2] db.add(ed_user) db.commit() def test_pyd_sqa(): user = db.query(User).first() pydantic_user = PydanticUser.model_validate(user) data = pydantic_user.model_dump() assert data == { "fullname": "Ed Jones", "id": 1, "name": "ed", "nickname": "edsnickname", } pydantic_user_with_addresses = PydanticUserWithAddresses.model_validate(user) data = pydantic_user_with_addresses.model_dump() assert data == { "fullname": "Ed Jones", "id": 1, "name": "ed", "nickname": "edsnickname", "addresses": [ {"email_address": "ed@example.com", "id": 1, "user_id": 1}, {"email_address": "eddy@example.com", "id": 2, "user_id": 1}, ], }