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 [email protected]
>> <mailto:[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.
>>
>
> --
> 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/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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/sqlalchemy/09776252-85d2-f8b7-5eb8-b6b8d0a96562%40Damon-Family.org.