SQLAlchemy custom type to automatically serialize/deserialize pydantic models
Project description
SQLAlchemy Pydantic Type
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:
-
Install the package with Alembic support:
pip install sqlalchemy_pydantic_type[alembic]
-
In your Alembic environment (
env.py), import therender_itemfunction:from sqlalchemy_pydantic_type.alembic import render_item
-
Add the
render_itemargument to allcontext.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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sqlalchemy_pydantic_type-0.0.3.tar.gz.
File metadata
- Download URL: sqlalchemy_pydantic_type-0.0.3.tar.gz
- Upload date:
- Size: 7.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
80b346427db3f5608c3455d43c40e3122f3ebb42c39118ad2a4f4475d334eecf
|
|
| MD5 |
f902cf95d423757fea96047cb50322a9
|
|
| BLAKE2b-256 |
9053bbaae8ed0441a1a256487502c7c7376bc3a40e52369d3fbf1cacbc3a16ae
|
Provenance
The following attestation bundles were made for sqlalchemy_pydantic_type-0.0.3.tar.gz:
Publisher:
build.yml on bartosz121/sqlalchemy-pydantic-type
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sqlalchemy_pydantic_type-0.0.3.tar.gz -
Subject digest:
80b346427db3f5608c3455d43c40e3122f3ebb42c39118ad2a4f4475d334eecf - Sigstore transparency entry: 789662703
- Sigstore integration time:
-
Permalink:
bartosz121/sqlalchemy-pydantic-type@18dc9f0803e8acc41a58143d3d96feb7e35bcd43 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/bartosz121
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build.yml@18dc9f0803e8acc41a58143d3d96feb7e35bcd43 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sqlalchemy_pydantic_type-0.0.3-py3-none-any.whl.
File metadata
- Download URL: sqlalchemy_pydantic_type-0.0.3-py3-none-any.whl
- Upload date:
- Size: 7.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ebed8a98caba4525a1209f6df19755a86b7bc23703857db46afae3f69404b32b
|
|
| MD5 |
c7c7ad664e090acabc69b80aa9820555
|
|
| BLAKE2b-256 |
56b4994e615590292691719be42119cc61f7a5770d0f04a37d56c5bc5f74fa3b
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sqlalchemy_pydantic_type-0.0.3-py3-none-any.whl -
Subject digest:
ebed8a98caba4525a1209f6df19755a86b7bc23703857db46afae3f69404b32b - Sigstore transparency entry: 789662707
- Sigstore integration time:
-
Permalink:
bartosz121/sqlalchemy-pydantic-type@18dc9f0803e8acc41a58143d3d96feb7e35bcd43 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/bartosz121
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build.yml@18dc9f0803e8acc41a58143d3d96feb7e35bcd43 -
Trigger Event:
push
-
Statement type: