On Tue, Dec 15, 2020, at 9:17 AM, Larry Martell wrote:
> Yes, I have:
>
> class BusinessArea(Base):
> .
> .
> .
> Contact = relationship('Contact', secondary='BusinessAreaContact')
>
> Is there anything I can do now to be able to proceed with my development?
Ah I in fact noticed something else which is that your table name matches your
class name! OK well that explains why that's like this and....I should
probably do something about that as well, ill add that to the bug I'm fixing.
For now the forms that will work are:
direct table:
Contact = relationship("Contact", secondary=BusinessAreaContact.__table__)
or use a lambda, if BusinessAreaContact is not imported yet:
Contact = relationship("Contact", secondary=lambda:
BusinessAreaContact.__table__)
if you have a large application and you can't get BAC imported there or get at
its table, here's a worst case workaround:
# work around SQLAlchemy issue #5774
def get_bac_table():
from myapp import BusinessAreaContact
return BusinessAreaContact.__table__
Contact = relationship("Contact", secondary=get_bac_table)
>
> On Tue, Dec 15, 2020 at 9:07 AM Mike Bayer <[email protected]> wrote:
> >
> > Thanks for that.
> >
> > So I think I'm going to make a small change here because I'm amazed that
> > this is the error you're getting, for something that is likely a very
> > common mistake and we should be checking for this.
> >
> > It seems likely, as I can reproduce this exactly here, that somewhere in
> > your model you have something like this:
> >
> > class Something(...):
> > # ...
> > things = relationship(SomethignElse, secondary=BusinessAreaContact)
> >
> > the mappers are trying to configure themselves and are tripping over that;
> > it expects the "secondary" argument to be an instance of Table, not a
> > mapped class.
> >
> > so like:
> >
> > class Something(...):
> > # ...
> > things = relationship(SomethignElse,
> > secondary=BusinessAreaContact.__table__)
> >
> > but again I'm amazed we aren't checking for this? so i want to fix that
> > now. thanks for reporting!
> >
> >
> >
> >
> >
> >
> > On Tue, Dec 15, 2020, at 8:58 AM, Larry Martell wrote:
> >
> > File "/var/task/common/repository.py", line 74, in delete_all
> > res = self._session.query(model).delete()
> > File "/opt/python/sqlalchemy/orm/session.py", line 1558, in query
> > return self._query_cls(entities, self, **kwargs)
> > File "/opt/python/sqlalchemy/orm/query.py", line 191, in __init__
> > self._set_entities(entities)
> > File "/opt/python/sqlalchemy/orm/query.py", line 219, in _set_entities
> > self._set_entity_selectables(self._entities)
> > File "/opt/python/sqlalchemy/orm/query.py", line 250, in
> > _set_entity_selectables
> > ent.setup_entity(*d[entity])
> > File "/opt/python/sqlalchemy/orm/query.py", line 4187, in setup_entity
> > self._with_polymorphic = ext_info.with_polymorphic_mappers
> > File "/opt/python/sqlalchemy/util/langhelpers.py", line 883, in __get__
> > obj.__dict__[self.__name__] = result = self.fget(obj)
> > File "/opt/python/sqlalchemy/orm/mapper.py", line 2141, in
> > _with_polymorphic_mappers
> > configure_mappers()
> > File "/opt/python/sqlalchemy/orm/mapper.py", line 3255, in configure_mappers
> > mapper._post_configure_properties()
> > File "/opt/python/sqlalchemy/orm/mapper.py", line 1950, in
> > _post_configure_properties
> > prop.init()
> > File "/opt/python/sqlalchemy/orm/interfaces.py", line 196, in init
> > self.do_init()
> > File "/opt/python/sqlalchemy/orm/relationships.py", line 1984, in do_init
> > self._setup_join_conditions()
> > File "/opt/python/sqlalchemy/orm/relationships.py", line 2048, in
> > _setup_join_conditions
> > self._join_condition = jc = JoinCondition(
> > File "/opt/python/sqlalchemy/orm/relationships.py", line 2408, in __init__
> > self._determine_joins()
> > File "/opt/python/sqlalchemy/orm/relationships.py", line 2504, in
> > _determine_joins
> > self.secondaryjoin = join_condition(
> > File "<string>", line 2, in join_condition
> > File "<string>", line 2, in _join_condition
> > File "/opt/python/sqlalchemy/util/deprecations.py", line 128, in warned
> > return fn(*args, **kwargs)
> > File "/opt/python/sqlalchemy/sql/selectable.py", line 932, in
> > _join_condition
> > constraints = cls._joincond_scan_left_right(
> > File "/opt/python/sqlalchemy/sql/selectable.py", line 987, in
> > _joincond_scan_left_right
> > b.foreign_keys, key=lambda fk: fk.parent._creation_order
> > AttributeError: type object 'BusinessAreaContact' has no attribute
> > 'foreign_keys'
> >
> > On Tue, Dec 15, 2020 at 8:50 AM Mike Bayer <[email protected]> wrote:
> > >
> > > hey there -
> > >
> > > I don't know what that is. Can you share the complete stack trace? that
> > > would show me where it is misinterpreting something. thanks!
> > >
> > >
> > >
> > > On Tue, Dec 15, 2020, at 7:48 AM, Larry Martell wrote:
> > >
> > > I have this model class:
> > >
> > > class BusinessAreaContact(Base):
> > > __tablename__ = 'BusinessAreaContact'
> > >
> > > businessAreaID = Column(ForeignKey('BusinessArea.businessAreaID'),
> > > primary_key=True, nullable=False)
> > > contactEmail = Column(ForeignKey('Contact.contactEmail'),
> > > primary_key=True, nullable=False)
> > >
> > > If I try and delete from the table with:
> > >
> > > session.query(BusinessAreaContact).delete()
> > >
> > > I get:
> > >
> > > AttributeError: type object 'BusinessAreaContact' has no attribute
> > > 'foreign_keys'
> > >
> > > I have other models where I define FKs in the same way, and I do not
> > > get that error with those. What makes this model different and how can
> > > I fix this error?
> > >
> > > Thanks!
> >
> > --
> > 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/CACwCsY78enZdOfFZ4Pjx0efTebNyMeTady72z-piiM-VSq6CpA%40mail.gmail.com.
> >
> >
> > --
> > 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/6a0edecd-d9b2-4442-8941-0d06c171cf4e%40www.fastmail.com.
>
> --
> 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/CACwCsY5T0%3D0TqKNQcKVdWa0QMYxH8%2B1RBz2wEyAvODv_Ye%2BqUw%40mail.gmail.com.
>
--
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/faaeccf1-03df-47d9-bb6b-c9dc6dfdf113%40www.fastmail.com.