spacepaste

  1.  
  2. from sqlalchemy import Column, String, ForeignKeyConstraint, Integer
  3. from sqlalchemy.ext.declarative import declarative_base, declared_attr
  4. class TableName(object):
  5. @declared_attr
  6. def __tablename__(cls):
  7. return cls.__name__
  8. Base=declarative_base(cls=TableName)
  9. class TMixin(object):
  10. @declared_attr
  11. def user(cls):
  12. return Column(String, primary_key=True)
  13. @declared_attr
  14. def timestamp(cls):
  15. return Column(Integer, autoincrement=False, primary_key=True)
  16. class Timeline(TMixin, Base):
  17. snaptype = Column(Integer, primary_key=True, autoincrement=False)
  18. __mapper_args__ = {'polymorphic_on': snaptype}
  19. class CMixin(TMixin):
  20. @declared_attr
  21. def __table_args__(cls):
  22. return (ForeignKeyConstraint(
  23. ['user', 'timestamp'],
  24. ['Timeline.user', 'Timeline.timestamp']),)
  25. @declared_attr
  26. def __mapper_args__(cls):
  27. return {'polymorphic_identity': CMixin.__subclasses__().index(cls)}
  28. class C(CMixin, Timeline):
  29. pass
  30.