I read the docs but it never occurred to me that *both* the join objects 
have to be tables.
Thanks! :)

Leaving the correct join formula here for future references, that produces 
indeed the right query.

SELECT employee.name, manager.manager_name
> FROM employee JOIN manager ON employee.id = manager.id


q = sqlalchemy.sql.select(
    [e.name, m.manager_name],
).select_from(
    e.__table__.join(m.__table__)
)


Il giorno martedì 8 marzo 2016 18:50:40 UTC+1, [email protected] ha 
scritto:
>
> I've spotted the following strange behaviour while using the last version 
> (SQLAlchemy==1.0.12) with SQLite or PostgreSQL (possibly others, too).
>
> To be short, I created a few polymorphic classes that map to their 
> respective tables;
> I'm unable to perform any query containing a LEFT OUTER JOIN from the 
> "superclass" to one of the subclasses.
>
> In fact, queries containing the left outer join are of the following form, 
> resulting in sqlalchemy.exc.OperationalError/ProgrammingError both on 
> SQLite and on PostgreSQL.
>
> SELECT employee.name, manager.manager_name
> FROM employee JOIN (employee JOIN manager ON employee.id = manager.id) ON 
> employee.id = manager.id
>
> As you can see, the "ON" condition appears twice, rendering the query 
> invalid. 
>
> A full program showing the problematic behaviour follows:
>
> from sqlalchemy import Column, Integer, String, ForeignKey
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy.orm import sessionmaker
> from sqlalchemy import create_engine
> import sqlalchemy.sql
>
>
> Base = declarative_base()
> engine = create_engine('sqlite:///:memory:', echo=True)
> Session = sessionmaker(bind=engine)
> Session.configure(bind=engine)
> session = Session()
>
>
>
>
> class Employee(Base):
>     __tablename__ = 'employee'
>     id = Column(Integer, primary_key=True)
>     name = Column(String(50))
>     type = Column(String(50))
>
>
>     __mapper_args__ = {
>         'polymorphic_identity': 'employee',
>         'polymorphic_on': type
>     }
>
>
>
>
> class Engineer(Employee):
>     __tablename__ = 'engineer'
>     id = Column(Integer, ForeignKey('employee.id'), primary_key=True)
>     engineer_name = Column(String(30))
>
>
>     __mapper_args__ = {
>         'polymorphic_identity': 'engineer',
>     }
>
>
>
>
> class Manager(Employee):
>     __tablename__ = 'manager'
>     id = Column(Integer, ForeignKey('employee.id'), primary_key=True)
>     manager_name = Column(String(30))
>
>
>     __mapper_args__ = {
>         'polymorphic_identity': 'manager',
>     }
>
>
> Base.metadata.create_all(engine)
>
>
> e = Employee
> m = Manager
>
>
> q = sqlalchemy.sql.select(
>     [e.name, m.manager_name],
> ).select_from(
>     e.__table__.join(m)
> )
> print(q)
> session.execute(q)
>
> Am I missing something here, maybe abusing the Core API?
>
> Best regards,
> Adriano
>

-- 
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 post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to