sqlalchemy-things’s documentation

Read The Docs build Release PyPI downloads count MIT License Python version support GitHub continuous integration codecov.io status for master branch

Utility collection for development with SQLAlchemy 1.4 / 2.0 ORM.

Installation

Installing sqlalchemy-things with pip:

pip install sqlalchemy-things

Optional requirements

For PostgreSQL support, you also need install asyncpg:

pip install asyncpg

For MySQL support, you also need install aiomysql:

pip install aiomysql

For SQLite3 support, you also need install aiosqlite:

pip install aiosqlite

Examples

Single table inheritance

from sqlalchemy_things.declarative import (
    IntegerPrimaryKeyMixin,
    PolymorphicMixin,
)

metadata = sa.MetaData()
Base = orm.declarative_base(metadata=metadata)


class Parent(Base, IntegerPrimaryKeyMixin, PolymorphicMixin):
    __tablename__ = 'single_table'


class ChildA(Parent):
    __mapper_args__ = {'polymorphic_identity': 'child_a'}
    some_field = sa.Column(sa.String(255))


class ChildB(Parent):
    __mapper_args__ = {'polymorphic_identity': 'child_b'}
    other_filed = sa.Column(sa.String(127))

Joined table inheritance with cascade primary key mixins

from sqlalchemy_things.declarative import (
    CascadeIntegerPrimaryKeyMixin,
    PolymorphicMixin,
)

metadata = sa.MetaData()
Base = orm.declarative_base(metadata=metadata)


class Parent(Base, CascadeIntegerPrimaryKeyMixin, PolymorphicMixin):
    __tablename__ = 'cascade_pk_parent_table'


class ChildA(Parent):
    __tablename__ = 'cascade_pk_child_table_a'
    __mapper_args__ = {'polymorphic_identity': 'child_a'}
    field = sa.Column(sa.String(255))


class ChildB(Parent):
    __tablename__ = 'cascade_pk_child_table_b'
    __mapper_args__ = {'polymorphic_identity': 'child_b'}
    field = sa.Column(sa.String(127))

Joined table inheritance with simple primary key mixins

from sqlalchemy_things.declarative import (
    IntegerPrimaryKeyMixin,
    ParentPrimaryKeyMixin,
    PolymorphicMixin,
)

metadata = sa.MetaData()
Base = orm.declarative_base(metadata=metadata)


class Parent(Base, IntegerPrimaryKeyMixin, PolymorphicMixin):
    __tablename__ = 'inherited_pk_parent_table'


class ChildA(ParentPrimaryKeyMixin, Parent):
    __tablename__ = 'inherited_pk_child_table_a'
    __mapper_args__ = {'polymorphic_identity': 'child_a'}
    field = sa.Column(sa.String(255))


class ChildB(ParentPrimaryKeyMixin, Parent):
    __tablename__ = 'inherited_pk_child_table_b'
    __mapper_args__ = {'polymorphic_identity': 'child_b'}
    field = sa.Column(sa.String(127))

Reference

Custom column types

class sqlalchemy_things.column_types.UUIDType(*args, **kwargs)

Bases: sqlalchemy.sql.type_api.TypeDecorator

Backend-agnostic UUID type.

Mixins for signle and joined inheritance

class sqlalchemy_things.declarative.PolymorphicMixin

Bases: sqlalchemy_things.declarative.base.DeclarativeMixin

Polymorphic mixin for single table and joined table inheritance.

Primary key mixins for signle and joined table inheritance

class sqlalchemy_things.declarative.BigIntegerPrimaryKeyMixin

Bases: sqlalchemy_things.declarative.base.DeclarativeMixin

Big integer primary key mixin.

Warning

SQLite backend not support autoincrement for BigInteger column type.

class sqlalchemy_things.declarative.DateTimePrimaryKeyMixin

Bases: sqlalchemy_things.declarative.base.DeclarativeMixin

Datetime primary key mixin.

class sqlalchemy_things.declarative.IntegerPrimaryKeyMixin

Bases: sqlalchemy_things.declarative.base.DeclarativeMixin

Integer primary key mixin.

class sqlalchemy_things.declarative.UUIDPrimaryKeyMixin

Bases: sqlalchemy_things.declarative.base.DeclarativeMixin

UUID primary key mixin.

Primary key mixins for joined table inheritance

class sqlalchemy_things.declarative.CascadeBigIntegerPrimaryKeyMixin

Bases: sqlalchemy_things.declarative.base.InheritedDeclarativeMixin

Cascade big integer primary key mixin for joined table inheritance.

Warning

SQLite backend not support autoincrement for BigInteger column type.

class sqlalchemy_things.declarative.CascadeDateTimePrimaryKeyMixin

Bases: sqlalchemy_things.declarative.base.InheritedDeclarativeMixin

Cascade datetime primary key mixin for joined table inheritance.

class sqlalchemy_things.declarative.CascadeIntegerPrimaryKeyMixin

Bases: sqlalchemy_things.declarative.base.InheritedDeclarativeMixin

Cascade integer primary key mixin for joined table inheritance.

class sqlalchemy_things.declarative.CascadeUUIDPrimaryKeyMixin

Bases: sqlalchemy_things.declarative.base.InheritedDeclarativeMixin

Cascade UUID primary key mixin for joined table inheritance.

class sqlalchemy_things.declarative.ParentPrimaryKeyMixin

Bases: sqlalchemy_things.declarative.base.InheritedDeclarativeMixin

Parent primary key mixin for child class in joined table inheritance without cascade primary key mixin.

Warning

This mixin must precede the parent class when declaring a child class.

Pagination

class sqlalchemy_things.pagination.OffsetPage(items: List[Any], number: int, page_size: int, total: int)

Bases: object

class sqlalchemy_things.pagination.OffsetPaginator(page_size: int = 20, max_page: Optional[int] = None)

Bases: object

Utils for single and joined inheritance

sqlalchemy_things.declarative.get_inherited_column(cls: Any, name: str, default: sqlalchemy.sql.schema.Column) Optional[sqlalchemy.sql.schema.Column]

Utility function for column inheriting in mixins.

Parameters
  • name – column name of parent class;

  • default – default value if not found in parent class.

sqlalchemy_things.declarative.get_inherited_primary_key(cls: Any) Optional[sqlalchemy.sql.schema.Column]

Utility function for creating child primary key in joined table inheritance.

Releases

Version 0.10.0

Added

  • Handling number < 1 for pagination.OffsetPaginator.get_page_async() and pagination.OffsetPaginator.get_page_sync.

Changed

  • renamed page_number to number for pagination classes;

  • renamed total_items to total for pagination classes.

Version 0.9.0

Changed

  • ValueError exception replaced with return None when exceeding the max_page in pagination.OffsetPage.

Version 0.8.0

Added

  • pagination.OffsetPage.

Changed

  • Renamed prepare_page_async() method to get_page_async() in pagination.OffsetPaginator;

  • Renamed prepare_page_sync() method to get_page_sync() in pagination.OffsetPaginator.

    Removed

  • get_items() method from pagination.OffsetPaginator;

  • get_last_page_number() method from pagination.OffsetPaginator;

  • get_next_page_number() method from pagination.OffsetPaginator;

  • get_previous_page_number() method from pagination.OffsetPaginator.

Version 0.7.0

Added

  • get_items() method for pagination.OffsetPaginator;

  • get_last_page_number() method for pagination.OffsetPaginator;

  • get_next_page_number() method for pagination.OffsetPaginator;

  • get_previous_page_number() method for pagination.OffsetPaginator.

Changed

  • Renamed get_page_async method to prepare_page_async in pagination.OffsetPaginator;

  • Renamed get_page_sync method to prepare_page_sync in pagination.OffsetPaginator.

Removed

  • pagination.OffsetPage.

Version 0.6.0

Added

  • max_page attribute for pagination.OffsetPaginator.

Changed

  • Renamed next attribute to next_number in pagination.OffsetPage;

  • Renamed previous attribute to previous_number in pagination.OffsetPage;

  • Renamed limit attribute to page_size in pagination.OffsetPaginator.

Version 0.5.0

Changed

  • Renamed pagination.CountOffsetPage to pagination.OffsetPage;

  • Renamed pagination.CountOffsetPaginator to pagination.OffsetPaginator;

  • Renamed get_async method to get_page_async in pagination.OffsetPaginator;

  • Renamed get_sync method to get_page_sync in pagination.OffsetPaginator.

Version 0.4.0

Added

  • pagination.CountOffsetPage;

  • pagination.CountOffsetPaginator.

Version 0.3.0

Changed

  • Rename definition attribute to discriminator in declarative.PolymorphicMixin.

Version 0.2.0

Changed

  • Rename key arg to name in declarative.get_inherited_column().

Version 0.1.0

Changed

  • Rename CascadeDeclarativeMixin to InheritedDeclarativeMixin;

  • Rename InheritedPrimaryKeyMixin to ParentPrimaryKeyMixin;

  • Move ParentPrimaryKeyMixin from declarative.base to declarative.primary_keys;

  • Move get_inherited_primary_key from declarative.base to declarative.primary_keys.