Skip to main content

SQLAlchemy custom type to automatically serialize/deserialize pydantic models

Project description

SQLAlchemy Pydantic Type

License Build Codecov PyPI Version Python Version

SQLAlchemy Pydantic Type is a Python package that bridges SQLAlchemy and Pydantic by providing a custom SQLAlchemy type for automatic serialization and deserialization of Pydantic models as database column values.

The main goal of this project is to make it easy to store and retrieve complex data structures (such as JSON fields) as Pydantic models in your SQLAlchemy 2.0 ORM models, with automatic conversion between Python objects and database representations.

See the examples directory for real-world usage.

Example

Using BasePydanticType with Pydantic models

Use BasePydanticType when your data is defined as a Pydantic BaseModel:

from typing import Any

from pydantic import BaseModel
from sqlalchemy import String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column

from sqlalchemy_pydantic_type import BasePydanticType


class Base(DeclarativeBase):
    pass


class PydanticString(BasePydanticType):
    """
    Custom type that serializes Pydantic models to JSON strings and
    deserializes JSON strings back into Pydantic models.
    """
    impl = String
    cache_ok = True

    def _default_model_serializer(self, model: BaseModel) -> Any:
        return model.model_dump_json()

    def _default_model_deserializer(self, value: Any | None) -> BaseModel:
        return self._pydantic_model_type.model_validate_json(value)


class UserMeta(BaseModel):
    roles: list[str]
    is_active: bool


class User(Base):
    __tablename__ = "users"

    id: Mapped[int] = mapped_column(primary_key=True)
    meta: Mapped[UserMeta] = mapped_column(PydanticString(UserMeta))

In this example, the meta column will automatically handle conversion between UserMeta Pydantic objects and JSON strings in the database.

Using BaseTypeAdapterType with dataclasses and other types

Use BaseTypeAdapterType when your data is defined as a dataclass, TypedDict, or any other type supported by Pydantic's TypeAdapter:

from dataclasses import dataclass
from typing import Any

from pydantic import TypeAdapter
from sqlalchemy import JSON, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column

from sqlalchemy_pydantic_type import BaseTypeAdapterType


class Base(DeclarativeBase):
    pass


@dataclass
class Address:
    street: str
    city: str


@dataclass
class UserProfile:
    name: str
    age: int
    address: Address


# Create a TypeAdapter for the dataclass
user_profile_adapter = TypeAdapter(UserProfile)


# Option 1: Specify the exact type
class UserProfileJSON(BaseTypeAdapterType[UserProfile]):
    impl = JSON
    cache_ok = True


# Option 2: Reusable version - use `Any` to work with any TypeAdapter
class TypeAdapterJSON(BaseTypeAdapterType[Any]):
    impl = JSON
    cache_ok = True


class User(Base):
    __tablename__ = "users"

    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str]
    profile: Mapped[UserProfile] = mapped_column(UserProfileJSON(user_profile_adapter))

In this example, the profile column stores a Python dataclass as JSON in the database, with automatic serialization and deserialization.

Alembic Support

To enable proper migration script generation when using SQLAlchemy Pydantic Type with Alembic, follow these steps:

  1. Install the package with Alembic support:

    pip install sqlalchemy_pydantic_type[alembic]
    
  2. In your Alembic environment (env.py), import the render_item function:

    from sqlalchemy_pydantic_type.alembic import render_item
    
  3. Add the render_item argument to all context.configure() calls:

    context.configure(
        url=url,
        target_metadata=target_metadata,
        literal_binds=True,
        render_item=render_item,  # Add this line
        dialect_opts={"paramstyle": "named"},
    )
    

This ensures that Alembic correctly generates migration scripts for columns using Pydantic types.

For a complete working example, check out the kitchen-sink example in the examples directory.

Development

For details on setting up the development environment and contributing, see CONTRIBUTING.md.

Credits

This package was created with The Hatchlor project template.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sqlalchemy_pydantic_type-0.0.3.tar.gz (7.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sqlalchemy_pydantic_type-0.0.3-py3-none-any.whl (7.5 kB view details)

Uploaded Python 3

File details

Details for the file sqlalchemy_pydantic_type-0.0.3.tar.gz.

File metadata

File hashes

Hashes for sqlalchemy_pydantic_type-0.0.3.tar.gz
Algorithm Hash digest
SHA256 80b346427db3f5608c3455d43c40e3122f3ebb42c39118ad2a4f4475d334eecf
MD5 f902cf95d423757fea96047cb50322a9
BLAKE2b-256 9053bbaae8ed0441a1a256487502c7c7376bc3a40e52369d3fbf1cacbc3a16ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for sqlalchemy_pydantic_type-0.0.3.tar.gz:

Publisher: build.yml on bartosz121/sqlalchemy-pydantic-type

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sqlalchemy_pydantic_type-0.0.3-py3-none-any.whl.

File metadata

File hashes

Hashes for sqlalchemy_pydantic_type-0.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 ebed8a98caba4525a1209f6df19755a86b7bc23703857db46afae3f69404b32b
MD5 c7c7ad664e090acabc69b80aa9820555
BLAKE2b-256 56b4994e615590292691719be42119cc61f7a5770d0f04a37d56c5bc5f74fa3b

See more details on using hashes here.

Provenance

The following attestation bundles were made for sqlalchemy_pydantic_type-0.0.3-py3-none-any.whl:

Publisher: build.yml on bartosz121/sqlalchemy-pydantic-type

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page