yup that was the idea

On Thu, Sep 3, 2020, at 10:24 AM, Richard Damon wrote:
> I have a large number (around a dozen or more, and likely to grow) of
> derived classes, so I was hoping to cut down repetition with the
> @declared_attr.
> So, 3rd (or farther) derived classes need the inherit_condition to point
> to their immediate base. That does seem to remove the warning.
> 
> On 9/3/20 9:58 AM, Mike Bayer wrote:
> > you might be able to use the declared_attr __mapper__ but you would
> > need to omit that erroneous inherit condition if the class is
> > "Name".   IMO it would be easier to follow and understand by simply
> > using explicit __mapper_args__ on each class but this depends on what
> > you're doing.
> >
> >
> >
> > On Thu, Sep 3, 2020, at 7:24 AM, Richard Damon wrote:
> >> I've tried taking my code and changing the ForeignKey to be to Node, and
> >> that doesn't change the Warning.
> >> Is the problem trying to DRY with the @declared_attr __mapper__?
> >>
> >> On 9/2/20 11:29 PM, Mike Bayer wrote:
> >> > well you are giving Name an inherit condition that conflicts with how
> >> > you set up the foreign key. 
> >> >
> >> > Name.node_id FKs to Property.node_id
> >> >
> >> > but then inherit condition is Name.node_id -> Node.node_id
> >> >
> >> > There seems to be a little unsmoothness to actually being able to
> >> > configure it that way, that is, skipping over Property.node_id, but in
> >> > this case your FKs make it clear what you're going for which is the
> >> > "normal' setup of Name->Property->Node so you can remove "inherit
> >> > condition" from Name and it works fine:
> >> >
> >> > class Name(Property):
> >> >     __tablename__ = 'Name'
> >> >
> >> >     node_id = Column(Integer, ForeignKey("Property.node_id"),
> >> > primary_key=True)
> >> >
> >> >     __mapper_args__ = {
> >> >         "polymorphic_identity": "Name",
> >> >     }
> >> >
> >> >
> >> > or set it:
> >> >
> >> > class Name(Property):
> >> >     __tablename__ = 'Name'
> >> >
> >> >     node_id = Column(Integer, ForeignKey("Property.node_id"),
> >> > primary_key=True)
> >> >
> >> >     __mapper_args__ = {
> >> >         "polymorphic_identity": "Name",
> >> >         "inherit_condition": node_id == Property.node_id,
> >> >     }
> >> >
> >> >
> >> >
> >> > On Wed, Sep 2, 2020, at 10:08 PM, Richard Damon wrote:
> >> >> Here is the code, note in all cases node_id  are foreign
> >> key/primary_key
> >> >> to a primary_key down the chain:
> >> >>
> >> >>
> >> >> class Base:
> >> >>     """Base Class for SQLAlchemy ORM Classes"""
> >> >>     @declared_attr
> >> >>     def __tablename__(cls):
> >> >>         """Default the Table Name to the Class Name"""
> >> >>         return cls.__name__
> >> >>
> >> >> Base = declarative_base(cls=Base)
> >> >>
> >> >> class Node(Base):
> >> >>     """Class repesents the base of the User Data types."""
> >> >>     node_id = Column(Integer, primary_key=True)
> >> >>     type_name = Column(String(255), nullable=False)  # todo should
> >> come
> >> >> from type_id
> >> >>
> >> >>     @declared_attr
> >> >>     def __mapper_args__(cls):
> >> >>         if cls.__name__ == 'Node' :
> >> >>             __mapper_args__ = {
> >> >>                 'polymorphic_identity': 'Node',
> >> >>                 'polymorphic_on': cls.type_name,
> >> >>             }
> >> >>         else:
> >> >>             __mapper_args__ = {
> >> >>                 'polymorphic_identity': cls.__tablename__,
> >> >>                 "inherit_condition": cls.node_id == Node.node_id
> >> >>             }
> >> >>         return __mapper_args__
> >> >>
> >> >> class Property(Node):
> >> >>     node_id = Column(Integer, ForeignKey('Node.node_id'),
> >> >> primary_key=True)
> >> >>     ref_id = Column(Integer, ForeignKey('Node.node_id'))
> >> >>
> >> >> class Name(Property):
> >> >>     node_id = Column(Integer, ForeignKey('Property.node_id'),
> >> >> primary_key=True)
> >> >>
> >> >>
> >> >> On 9/2/20 9:39 PM, Mike Bayer wrote:
> >> >> > there's an FAQ entry, a little bit dated but the general idea is
> >> still
> >> >> > there, at:
> >> >> >
> >> >>
> >> > https://docs.sqlalchemy.org/en/13/faq/ormconfiguration.html#i-m-getting-a-warning-or-error-about-implicitly-combining-column-x-under-attribute-y
> >> >> >
> >> >> > for joined table inheritance, where Name(Node) -> node_id are FK ->
> >> >> > PK, the warning isn't emitted.  so please share the mapping if it is
> >> >> > doing this when it shouldnt.
> >> >> >
> >> >> >
> >> >> > On Wed, Sep 2, 2020, at 9:08 PM, Richard Damon wrote:
> >> >> >> I am getting the following error:
> >> >> >>
> >> >> >> SAWarning: Implicitly combining column Node.node_id with column
> >> >> >> Name.node_id under attribute 'node_id'.  Please configure one
> >> or more
> >> >> >> attributes for these same-named columns explicitly.
> >> >> >>
> >> >> >> In my case I am using poymorphic classes by joining with the
> >> ORM. Node
> >> >> >> is the base of the hierarchy (derived from declarative_base),
> >> then I
> >> >> >> have a class Property derived from it, and a class Name derived
> >> from
> >> >> >> Property. Each class has a primary_key named node_id, with a
> >> >> foreign key
> >> >> >> constraint one step done the hierarchy. I have also tried making
> >> >> all the
> >> >> >> Foreign key constraints point to Node.node_id and it doesn't make a
> >> >> >> difference.
> >> >> >>
> >> >> >> It is just a warning, and the lookup does seem to make the double
> >> >> join,
> >> >> >> so it doesn't seem to be a big problem, but it seems it want me to
> >> >> >> configure something for these, but I am not sure what.
> >> >> >>
> >> >> >> Two level inheritance is working just fine, it is just where it
> >> >> hits the
> >> >> >> 3rd level that it seems to want something explicit.
> >> >> >>
> >> >> >> -- 
> >> >> >> Richard Damon
> >> >>
> >> >>
> >> >> -- 
> >> >> Richard Damon
> >>
> >> -- 
> >> Richard Damon
> >>
> >> -- 
> >> 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 sqlalchemy+unsubscr...@googlegroups.com
> >> <mailto:sqlalchemy+unsubscr...@googlegroups.com>.
> >> To view this discussion on the web
> >> visit 
> >> https://groups.google.com/d/msgid/sqlalchemy/290a226a-60b7-a3e3-70de-85ec47b7c142%40Damon-Family.org.
> >>
> >
> > -- 
> > 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 sqlalchemy+unsubscr...@googlegroups.com
> > <mailto:sqlalchemy+unsubscr...@googlegroups.com>.
> > To view this discussion on the web visit
> > https://groups.google.com/d/msgid/sqlalchemy/1a45c6d0-f85f-440a-af1f-47fa9b254e5b%40www.fastmail.com
> > <https://groups.google.com/d/msgid/sqlalchemy/1a45c6d0-f85f-440a-af1f-47fa9b254e5b%40www.fastmail.com?utm_medium=email&utm_source=footer>.
> 
> 
> -- 
> Richard Damon
> 
> -- 
> 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 sqlalchemy+unsubscr...@googlegroups.com.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/sqlalchemy/09776252-85d2-f8b7-5eb8-b6b8d0a96562%40Damon-Family.org.
> 

-- 
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 sqlalchemy+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/4e12f4a6-8190-4ef9-9645-9026f59c7ff7%40www.fastmail.com.

Reply via email to