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
> >>
> >> --
> >> 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]
> >> <mailto:[email protected]>.
> >> To view this discussion on the web
> >> visit
> >> https://groups.google.com/d/msgid/sqlalchemy/8fa8e94d-cc6f-5bf5-efeb-dbdbae0d7663%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 [email protected]
> > <mailto:[email protected]>.
> > To view this discussion on the web visit
> > https://groups.google.com/d/msgid/sqlalchemy/e07cc259-2216-4ece-baf9-daabebf4ac00%40www.fastmail.com
> > <https://groups.google.com/d/msgid/sqlalchemy/e07cc259-2216-4ece-baf9-daabebf4ac00%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 [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/sqlalchemy/7a9c5943-ff71-2a3e-a139-5feb522070e5%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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/sqlalchemy/e26bbed4-c6a1-4b12-ba0b-723767cd623d%40www.fastmail.com.