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)))},
            )
Beispiel #2
0
        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,
                    ))
                },
            )