-
- from sqlalchemy import Column, String, ForeignKeyConstraint, Integer
- from sqlalchemy.ext.declarative import declarative_base, declared_attr
-
-
- class TableName(object):
- @declared_attr
- def __tablename__(cls):
- return cls.__name__
-
-
- Base=declarative_base(cls=TableName)
-
-
- class TMixin(object):
-
- @declared_attr
- def user(cls):
- return Column(String, primary_key=True)
-
- @declared_attr
- def timestamp(cls):
- return Column(Integer, autoincrement=False, primary_key=True)
-
-
- class Timeline(TMixin, Base):
-
- snaptype = Column(Integer, primary_key=True, autoincrement=False)
-
- __mapper_args__ = {'polymorphic_on': snaptype}
-
-
- class CMixin(TMixin):
-
- @declared_attr
- def __table_args__(cls):
- return (ForeignKeyConstraint(
- ['user', 'timestamp'],
- ['Timeline.user', 'Timeline.timestamp']),)
-
- @declared_attr
- def __mapper_args__(cls):
- return {'polymorphic_identity': CMixin.__subclasses__().index(cls)}
-
-
- class C(CMixin, Timeline):
-
- pass
-