4.6 KiB
SQLAlchemy-Utils
SQLAlchemy-Utils provides custom data types and various utility functions for SQLAlchemy.
Using automatic data coercion
SQLAlchemy-Utils provides various new data types for SQLAlchemy and in order to gain full advantage of these datatypes you should use coercion_listener. Setting up the listener is easy:
import sqlalchemy as sa
from sqlalchemy_utils import coercion_listener
sa.event.listen(sa.orm.mapper, 'mapper_configured', coercion_listener)
The listener automatically detects SQLAlchemy-Utils compatible data types and coerces all attributes using these types to appropriate objects.
Example :
from colour import Color
from sqlalchemy_utils import ColorType
class Document(Base):
__tablename__ = 'document'
id = sa.Column(sa.Integer, autoincrement=True)
name = sa.Column(sa.Unicode(50))
background_color = sa.Column(ColorType)
document = Document()
document.background_color = 'F5F5F5'
document.background_color # Color object
session.commit()
Data types
SQLAlchemy-Utils provides various new data types for SQLAlchemy.
sqlalchemy_utils.types
ArrowType
sqlalchemy_utils.types.arrow
ArrowType
ChoiceType
sqlalchemy_utils.types.choice
ChoiceType
ColorType
sqlalchemy_utils.types.color
ColorType
JSONType
sqlalchemy_utils.types.json
JSONType
LocaleType
sqlalchemy_utils.types.locale
LocaleType
NumberRangeType
sqlalchemy_utils.types.number_range
NumberRangeType
PasswordType
sqlalchemy_utils.types.password
PasswordType
PhoneNumberType
sqlalchemy_utils.types.phone_number
PhoneNumberType
ScalarListType
sqlalchemy_utils.types.scalar_list
ScalarListType
TimezoneType
sqlalchemy_utils.types.timezone
TimezoneType
URLType
sqlalchemy_utils.types.url
URLType
UUIDType
sqlalchemy_utils.types.uuid
UUIDType
Aggregated attributes
sqlalchemy_utils.aggregates
aggregated_attr
The generates decorator
sqlalchemy_utils.decorators
generates
Generic Relationship
Generic relationship is a form of relationship that supports creating a 1 to many relationship to any target model.
from sqlalchemy_utils import generic_relationship
class User(Base):
__tablename__ = 'user'
id = sa.Column(sa.Integer, primary_key=True)
class Customer(Base):
__tablename__ = 'customer'
id = sa.Column(sa.Integer, primary_key=True)
class Event(Base):
__tablename__ = 'event'
id = sa.Column(sa.Integer, primary_key=True)
# This is used to discriminate between the linked tables.
object_type = sa.Column(sa.Unicode(255))
# This is used to point to the primary key of the linked row.
object_id = sa.Column(sa.Integer)
object = generic_relationship(object_type, object_id)
# Some general usage to attach an event to a user.
us_1 = User()
cu_1 = Customer()
session.add_all([us_1, cu_1])
session.commit()
ev = Event()
ev.object = us_1
session.add(ev)
session.commit()
# Find the event we just made.
session.query(Event).filter_by(object=us_1).first()
# Find any events that are bound to users.
session.query(Event).filter(Event.object.is_type(User)).all()
Utility functions
sqlalchemy_utils.functions
declarative_base
declarative_base
escape_like
escape_like
has_changes
has_changes
identity
identity
is_indexed_foreign_key
is_indexed_foreign_key
naturally_equivalent
naturally_equivalent
non_indexed_foreign_keys
non_indexed_foreign_keys
sort_query
sort_query