[sqlalchemy] Re: Joinedload from child to parent in a joined table relationship

2020-11-03 Thread Alex Collins
Thanks so much! I was interpreting the parenthesis as a subquery. Been 
banging my head against the wall thinking this was SQLAlchemy nonsense for 
quite a while and it was just a simple misundertstanding of syntax. Now, 
I've got the information I should be able to fix this within the far 
messier application code. 
On Tuesday, November 3, 2020 at 8:57:18 AM UTC-3:30 Alex Collins wrote:

> Trying to configure a set of relationships to all be joined loaded and the 
> particular relationship structure doesn’t seem to want to join. I have a 
> one-to-many relationship where the many is the child in joined table 
> inheritance. The foreign key to my source table is on the polymorphic child 
> table. But, however I configure the relationship it does a subquery instead 
> of a joined load on the parent class.
>
> Built a test application as a demonstration. What I want is to have the 
> script below function the same way but, the query at the end outputs a 
> joinedload for PolyParent instead of a subquery. 
>
> from sqlalchemy import Column, ForeignKey, Integer, Text, create_engine
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy.orm import relationship, sessionmaker
>
> Base = declarative_base()
>
> class PolyParent(Base):
> __tablename__ = "poly_parent"
> id = Column(Integer, primary_key=True)
> type = Column(Text)
> __mapper_args__ = {"polymorphic_identity": "poly_parent", 
> "polymorphic_on": type}
>
> class PolyChild(PolyParent):
> __tablename__ = "poly_child"
> id = Column(Integer, ForeignKey("poly_parent.id"), primary_key=True)
> parent_id = Column(Integer, ForeignKey("source.id"))
> __mapper_args__ = {"polymorphic_identity": "poly_child"}
>
> class Source(Base):
> __tablename__ = "source"
> id = Column(Integer, primary_key=True)
> children = relationship(PolyChild)
>
> engine = create_engine("sqlite://")
> session = sessionmaker(bind=engine)()
> Base.metadata.create_all(bind=engine)
>
> print(session.query(Source).join(Source.children))
>

-- 
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/dad45bfd-a764-4354-8b6c-fe5ce58db925n%40googlegroups.com.


[sqlalchemy] Joinedload from child to parent in a joined table relationship

2020-11-03 Thread Alex Collins
Trying to configure a set of relationships to all be joined loaded and the 
particular relationship structure doesn’t seem to want to join. I have a 
one-to-many relationship where the many is the child in joined table 
inheritance. The foreign key to my source table is on the polymorphic child 
table. But, however I configure the relationship it does a subquery instead 
of a joined load on the parent class.

Built a test application as a demonstration. What I want is to have the 
script below function the same way but, the query at the end outputs a 
joinedload for PolyParent instead of a subquery. 

from sqlalchemy import Column, ForeignKey, Integer, Text, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker

Base = declarative_base()

class PolyParent(Base):
__tablename__ = "poly_parent"
id = Column(Integer, primary_key=True)
type = Column(Text)
__mapper_args__ = {"polymorphic_identity": "poly_parent", 
"polymorphic_on": type}

class PolyChild(PolyParent):
__tablename__ = "poly_child"
id = Column(Integer, ForeignKey("poly_parent.id"), primary_key=True)
parent_id = Column(Integer, ForeignKey("source.id"))
__mapper_args__ = {"polymorphic_identity": "poly_child"}

class Source(Base):
__tablename__ = "source"
id = Column(Integer, primary_key=True)
children = relationship(PolyChild)

engine = create_engine("sqlite://")
session = sessionmaker(bind=engine)()
Base.metadata.create_all(bind=engine)

print(session.query(Source).join(Source.children))

-- 
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/70b48614-d1c0-42f4-8792-ed96f181915dn%40googlegroups.com.