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.