On Wed, Mar 21, 2018 at 12:07 AM, Russell Warren <[email protected]> wrote: > I'm having trouble with SQLAlchemy throwing the warning "Unmanaged access of > declarative attribute" when I try and inherit `__table_args__` with > declarative.
this is not a covered use case. Looking at the commit for that warning, it's not clear this is coming from a specific user case that was reported, just that normally a @declared_attr is not supposed to be accessed outside of setting up a mapping, and the _sa_declared_attr_reg is in fact designed to only be present within the declarative mapping process, to hold onto the value of the declared attr so that we dont call it more than once. Basically there have been cases in the past where some declarative setup returns a Column object, then they do meaningful things with that Column (like add it to other mapping configurations), then it gets replaced later by another Column because the declared attr was called again and the mappings blow up. That's what the registry is meant to fix (here is the example of that: https://bitbucket.org/zzzeek/sqlalchemy/issues/3149/mixin_column-to-provide-more-context-for). But the registry fixes that. the warning is showing itself to be overkill here. so let's take it out > > I've been through the docs here: > http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/mixins.html#combining-table-mapper-arguments-from-multiple-mixins > > ... but the examples provided do not include a base class whose > `__table_args__` can be simply inherited (ie: used as-is without needing to > redefine `__table_args__` in the subclass). > > I've been through the code and see why the warning is thrown (the class > doesn't have a `_sa_class_manager` property bolted on yet), but I can't tell > if this is something I can just ignore or not. It currently seems like it > can't be ignored since I'm having some weird problems around this code > (still under investigation), but I'd like to know if there is some way to > safely prevent this warning while achieving the desired inheritance. If it > *is* actually ignorable, I've gone as far as considering temporarily hacking > on a `_sa_class_manager` property to suppress the warning, but yuck. > > Below is a small example of what I'm talking about. The > `_BaseTableSetup_MIXIN` class sets up some common table definitions. Foo and > Bar use them outright via simple inheritance. Baz tries to extend the > `__table_args__`, but runs into the warning when accessing `__table_args__` > on the parent mixin. > > Am I doing something wrong? > How can this be done properly? > Is ignoring the warning a bad idea? > > ### > # sample code > > class _BaseTableSetup_MIXIN(object): > a = Column(Integer) > @declared_attr # so subclasses > def __table_args__(cls): > # all derived classes/tables must have the unique constraint (but > should > # also be free to add more) > return (UniqueConstraint("a"), ) > > class Foo(ORMBase, _BaseTableSetup_MIXIN): > # This class defines no extra __table_args > b = Column(Integer) > > class Bar(ORMBase, _BaseTableSetup_MIXIN): > # This class also defines no extra __table_args > c = Column(Integer) > > class Baz(ORMBase, _BaseTableSetup_MIXIN): > # This class needs the full base setup, plus additional __table_args__ > d = Column(Integer) > @declared_attr > def __table_args__(cls): > ret = list(_BaseTableSetup_MIXIN.__table_args__) # WARNING THROWN > HERE! > ret.append(UniqueConstraint("d")) > return tuple(ret) > > ### > > -- > SQLAlchemy - > The Python SQL Toolkit and Object Relational Mapper > > http://www.sqlalchemy.org/ > > To post example code, please provide an MCVE: Minimal, Complete, and > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > description. > --- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.
