I want to have a polymorphic table that gets its identity from a column in 
a "type" table. I have a "task" table and a "task_type" table. I want to be 
able to create task subclasses that say something like:

    __mapper_args__ = {
        'polymorphic_identity': 'do_stuff_task',
    }

(Assuming that a row with do_stuff_task is created in the task_type table)


Currently in my base Task class I do:

    task_type_name = column_property(select([TaskType.task_type]).where(
TaskType.id == task_type_id).as_scalar())

    __mapper_args__ = {
        'polymorphic_on': task_type_name,
    }


If I try to get say, a user.do_stuff_tasks relationship it emits the 
following SQL:

SELECT
  (SELECT task_type.task_type
   FROM task_type
   WHERE task_type.id = task.task_type_id)
FROM task
WHERE 123 = task.user_id
  AND
    (SELECT task_type.task_type
     FROM task_type
     WHERE task_type.id = task.task_type_id) IN ('do_stuff_task');


This is technically correct, however this query is highly problematic for 
us. It does a scan on task in the subquery, which is extremely unpleasant 
and basically takes forever.
What I want is something more like:

SELECT *
FROM task st
JOIN task_type stt ON st.task_type_id=stt.id
WHERE stt.task_type='do_stuff_task'
  AND st.user_id=123;

Is there some way to rewrite the column_property or polymorphic identity 
condition to combine the WHERE conditions in the JOIN instead of doing two 
subselects?


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 sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to