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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/290a226a-60b7-a3e3-70de-85ec47b7c142%40Damon-Family.org.

Reply via email to