class WidgetDC: __sa_dataclass_metadata_key__ = "sa" widget_id: int = dataclasses.field( init=False, metadata={"sa": Column(Integer, primary_key=True)}, ) # fk on mixin account_id: int = dataclasses.field( init=False, metadata={ "sa": declared_attr(lambda: Column( Integer, ForeignKey("accounts.account_id"), nullable=False, )) }, ) has_a_default: str = dataclasses.field( default="some default", metadata={"sa": declared_attr(lambda: Column(String(50)))}, )
def _linktable(left_name, right_name, **addtional_columns): ''' Prepare and return a Calibre link table base class. Parameters: * `left_name`: the left hand entity, lowercase, singular, example `'book'` * `right_name`: the right hand entity, lowercase, singular, example `'author'` * `addtional_columns`: other keyword parameters define further `Column`s and relationships ''' class linktable(_CalibreTable): ''' Prepare a `_CalibreTable` subclass representing a Calibre link table. ''' __tablename__ = f'{left_name}s_{right_name}s_link' setattr( linktable, f'{left_name}_id', declared_attr(lambda self: Column( left_name, ForeignKey(f'{left_name}s.id'), primary_key=True, ))) setattr( linktable, left_name, declared_attr(lambda self: relationship( f'{left_name.title()}s', back_populates=f'{right_name}_links', ))) setattr( linktable, f'{right_name}_id', declared_attr(lambda self: Column( right_name, ForeignKey(f'{right_name}s.id'), primary_key=True, ))) setattr( linktable, right_name, declared_attr(lambda self: relationship( f'{right_name.title()}s', back_populates=f'{left_name}_links', ))) for colname, colspec in addtional_columns.items(): setattr( linktable, colname, declared_attr(lambda self, colspec=colspec: colspec), ) return linktable
class AccountDC: __sa_dataclass_metadata_key__ = "sa" # relationship on mixin widgets: List[Widget] = dataclasses.field( default_factory=list, metadata={"sa": declared_attr(lambda: relationship("Widget"))}, ) account_id: int = dataclasses.field( init=False, metadata={"sa": Column(Integer, primary_key=True)}, ) widget_count: int = dataclasses.field( init=False, metadata={ "sa": Column("widget_count", Integer, nullable=False) }, )
class User: __tablename__ = "user" __sa_dataclass_metadata_key__ = "sa" user_id: int = dataclasses.field( init=False, metadata={"sa": Column(Integer, primary_key=True)}, ) # fk w declared attr on mapped class account_id: int = dataclasses.field( init=False, metadata={ "sa": declared_attr(lambda: Column( Integer, ForeignKey("accounts.account_id"), nullable=False, )) }, )