Skip to main content

Tools to convert SQLAlchemy models to Pydantic models

Project description

Alchemista

Code style: black codecov

Tools to generate Pydantic models from SQLAlchemy models.

Still experimental.

Installation

Alchemista is available in PyPI. To install it with pip, run:

pip install alchemista

Usage

Simply call the model_from function with a SQLAlchemy model. Each Column in its definition will result in an attribute of the generated model via the Pydantic Field function.

For example, a SQLAlchemy model like the following

from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import declarative_base


Base = declarative_base()

class PersonDB(Base):
    __tablename__ = "people"

    id = Column(Integer, primary_key=True)
    age = Column(Integer, default=0, nullable=False, doc="Age in years")
    name = Column(String(128), nullable=False, doc="Full name")

could have a generated Pydantic model via

from alchemista import model_from

Person = model_from(PersonDB)

and would result in a Pydantic model equivalent to

from pydantic import BaseModel, Field


class Person(BaseModel):
    id: int
    age: int = Field(0, description="Age in years")
    name: str = Field(..., max_length=128, description="Full name")

    class Config:
        orm_mode = True

Note that the string length from the column definition was sufficient to add a max_length constraint. Additionally, by default, the generated model will have orm_mode=True. That can be customized via the __config__ keyword argument.

There is also an exclude keyword argument that accepts a set of field names to not include in the generated model, and an include keyword argument accepts a set of field names to do include in the generated model. However, they are mutually exclusive and cannot be used together.

This example is available in a short executable form in the examples/ directory.

Field arguments and info

Currently, the type, default value (either scalar or callable), and the description (from the doc attribute) are extracted directly from the Column definition. However, except for the type, all of them can be overridden via the info dictionary attribute. All other custom arguments to the Field function are specified there too. The supported keys are listed in alchemista.field.Info.

Everything specified in info is preferred from what has been extracted from Column. This means that the default value and the description can be overridden if so desired. Also, similarly to using Pydantic directly, default and default_factory are mutually-exclusive, so they cannot be used together. Use default_factory if the default value comes from calling a function (without any arguments).

For example, in the case above,

name = Column(String(128), nullable=False, doc="Full name", info=dict(description=None, max_length=64))

would instead result in

name: str = Field(..., max_length=64)

fields_from and model_from

The fields_from function is the function that actually inspects the SQLAlchemy model and builds a dictionary in a format that can be used to generate a Pydantic model. So model_from is just a shortcut for calling fields_from and then pydantic.create_model. The model name that model_from sets is db_model.__name__.

If desired, or extra control is needed, pydantic.create_model can be used directly, in conjunction with fields_from. This allows the customization of the name of the model that will be created and the specification of other create_model arguments, like __base__ and __validators__ (model_from currently only accepts __config__).

For example:

from alchemista import fields_from
from pydantic import create_model


MyModel = create_model("MyModel", **fields_from(DBModel))

License

This project is licensed under the terms of the MIT license.

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

alchemista-0.2.1.tar.gz (6.6 kB view details)

Uploaded Source

Built Distribution

alchemista-0.2.1-py3-none-any.whl (6.9 kB view details)

Uploaded Python 3

File details

Details for the file alchemista-0.2.1.tar.gz.

File metadata

  • Download URL: alchemista-0.2.1.tar.gz
  • Upload date:
  • Size: 6.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.10.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.6.13

File hashes

Hashes for alchemista-0.2.1.tar.gz
Algorithm Hash digest
SHA256 1d89d01a3720eb77b5f4e0057be09305169536dfc4f6023286170200c8ce67ca
MD5 1a56aa1565aa814ba4d70db9301b3497
BLAKE2b-256 44b0b203b7642925792a9d7d555138edbeb4bbb5e920289e8c78c2e72281ad5b

See more details on using hashes here.

File details

Details for the file alchemista-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: alchemista-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 6.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.10.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.6.13

File hashes

Hashes for alchemista-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 35cb726b3050f5bdbc9628b9c48e371b2200ece3bea317535a1d611e3bad9541
MD5 1099e0fdf38cd626a2be396d599bbd50
BLAKE2b-256 16be2aa7be12f173eb9a13337fc2d6052ba17a41cd0d4b5c32464f90a2de930f

See more details on using hashes here.

Supported by

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