I have some code that uses high-level ORM and it works fine, except that 
one particular section is too slow.  So I was trying to replace that 
section with a lower level query.  But I can't work out how to persuade the 
Expression Language to stop auto-correlation.

The query I am trying to generate is:
 
 select statistic_journal.id,
        statistic_name.name,
        coalesce(statistic_journal_float.value,
                 statistic_journal_integer.value)
   from statistic_journal
   join statistic_name
     on statistic_journal.statistic_name_id = statistic_name.id
   left outer join statistic_journal_float
     on statistic_journal.id = statistic_journal_float.id
   left outer join statistic_journal_integer
     on statistic_journal.id = statistic_journal_integer.id
  where statistic_name.owner = -19043;

But the closest I can get (only aiming for the outer join part of the 
query) is:

Python 3.7.0 (default, Aug 20 2018, 18:32:46) 
[GCC 7.3.1 20180323 [gcc-7-branch revision 258812]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from sqlalchemy import inspect
>>> from sqlalchemy.sql.functions import coalesce
>>> from sqlalchemy.sql import select
>>> from ch2.squeal.tables.statistic import StatisticJournal, StatisticName, 
StatisticJournalInteger, StatisticJournalFloat
>>> 
>>> sj = inspect(StatisticJournal).local_table
>>> sji = inspect(StatisticJournalInteger).local_table
>>> sjf = inspect(StatisticJournalFloat).local_table
>>> 
>>> print(select([sj.c.id,
...               coalesce(sjf.c.value, sji.c.value)])
...             .correlate_except(sji, sjf)
...             .outerjoin(sjf).outerjoin(sji))
(SELECT statistic_journal.id AS id, coalesce(statistic_journal_float.value, 
statistic_journal_integer.value) AS coalesce_1 
FROM statistic_journal, statistic_journal_float, statistic_journal_integer) 
LEFT OUTER JOIN statistic_journal_float ON id = statistic_journal_float.id 
LEFT OUTER JOIN statistic_journal_integer ON id = statistic_journal_integer.
id

I realise this is not complete or runnable, but I hope it illustrates the 
problem: the initial FROM includes statistic_journal_float and 
statistic_journal_integer.  I don't want those!  They should come later.  I 
was hoping that the correlate_except() would remove them, but it doesn't 
seem to have any effect.

Also, I am not sure if this is how you mix ORM and expression language 
(explicitly getting the tables via inspect).

Is that clear?  What am I doing wrong?  This is SQLAlchemy 1.2.14 if it 
makes any difference.

Thanks,
Andrew

-- 
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 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