On Dec 23, 2010, at 8:38 PM, kindly wrote:

> Hello
> 
> Is there a nice way to get the subquery object that relates to anon_1
> in the below case so you can use it to filter on?
> 
> You can get it by q._joinpoint['_joinpoint_entity'] but that is
> clearly private.
> 
> Thanks
> 
> David
> 
> 
> class Employee(object):    pass
> 
> class Manager(Employee):    pass
> 
> class ManagerInfo(object):    pass
> 
> employees = Table('employees', metadata,
>   Column('employee_id', Integer, primary_key=True),
>   Column('type', String(30), nullable=False)
> )
> 
> managers = Table('managers', metadata,
>   Column('employee_id', Integer, ForeignKey('employees.employee_id'),
> primary_key=True),
>   Column('manager_info_id', Integer, ForeignKey('manager_info.id'),
> primary_key=True),
> )
> 
> manager_info = Table('manager_info', metadata,
>   Column('id', Integer, primary_key=True),
>   Column('data', String(30), primary_key=True),
> )
> 
> 
> mapper(Employee, employees, polymorphic_on=employees.c.type, \
>    polymorphic_identity='employee')
> 
> mapper(Manager, managers, inherits=Employee,
> polymorphic_identity='engineer')
> 
> mapper(ManagerInfo,
>       manager_info,
>       properties = dict(manager = orm.relation(Manager))
>      )
> 
> session = Session()
> 
> q = session.query(ManagerInfo).join("manager")
> 
> print q
> 
> """SELECT manager_info.id AS manager_info_id, manager_info.data AS
> manager_info_data
> FROM manager_info JOIN (SELECT employees.employee_id AS
> employees_employee_id, employees.type AS employees_type,
> managers.employee_id AS managers_employee_id, managers.manager_info_id
> AS managers_manager_info_id
> FROM employees JOIN managers ON employees.employee_id =
> managers.employee_id) AS anon_1 ON manager_info.id =
> anon_1.managers_manager_info_id"""

Once you join to ManagerInfo.manager, you'd reference the right joinpoint using 
the Manager entity itself:

        query(ManagerInfo).join("manager").filter(Manager.foo == 'bar')

That's the reason for the whole joinpoint entity stuff, the Query is keeping 
track of it, will recognize the usage of "Manager" and will alias all 
expressions that use it.

You can also join to an alias of Manager:

        malias = aliased(Manager)
        query(ManagerInfo).join((malias, 
ManagerInfo.manager)).filter(malias.foo == 'bar')

If you need to reference the individual tables that comprise Manager, usually 
you do that via referencing "managers" and "employees" directly to start with.

The joined table inheritance query stuff has taken several years to get right, 
so if there's something its not doing at that level let me know and I can 
suggest a workaround or provide a fix.


-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to