Right; my bad - I misread the instructions.

On Sat, Dec 6, 2008 at 9:41 AM, Michael Bayer <[EMAIL PROTECTED]> wrote:
>
> you'd say, s.alias().select()
>
> it makes subqueries which MySQL probably doesn't require.
>
>
> On Dec 5, 2008, at 10:35 PM, Bo Shi wrote:
>
>>
>> Thanks; the monkeypatch approach works nicely.  Using the alias()
>> method will raise
>>
>>    AttributeError: 'Alias' object has no attribute '_order_by_clause'
>>
>>
>> On Fri, Dec 5, 2008 at 7:25 PM, Michael Bayer <[EMAIL PROTECTED]
>> > wrote:
>>>
>>> there's logic which is removing the order_by's from the selects, and
>>> in that case this is what's blowing away the parenthesis as well.
>>> Some databases don't even allow ORDER BY inside of the queries used
>>> in
>>> a UNION since in the absense of LIMIT/OFFSET, which also is not
>>> standard SQL, they have no effect.
>>>
>>> However I dont think its good form for SQLA to be whacking the ORDER
>>> BY from the unions if that is in fact what was requested.    So this
>>> behavior is changed in the 0.5 series in r5425.   As far as the 0.4
>>> series, we're only supporting critical bugfixes there and I'd like to
>>> avoid any behavioral changes (0.4 is also on a more conservative
>>> release schedule).   If you're truly stuck with 0.4, you can use
>>> select.order_by(...).alias().select() to get an equivalent query
>>> which
>>> is insulated from changes (and is probably more compatible across
>>> databases), or to get exactly the same SQL here's a safe monkeypatch
>>> approach:
>>>
>>> from sqlalchemy import *
>>> s = select(["x", "y"]).select_from("table")
>>>
>>> def frozen_order_by(s):
>>>    s = s.self_group()
>>>    s.order_by = lambda *args: s
>>>    return s
>>>
>>> qlist = [s.limit(10).order_by('x'), s.limit(10).order_by('x')]
>>> print union_all(*[frozen_order_by(q) for q in
>>> qlist]).order_by("foo").limit(10)
>>>
>>> frozen_order_by() calls self_group() thereby generating a new
>>> select()
>>> so that the original is unchanged.
>>>
>>>
>>>
>>> On Dec 5, 2008, at 5:08 PM, Bo Shi wrote:
>>>
>>>>
>>>> Oh, check this out:
>>>>
>>>> (SA 0.4.7)
>>>>
>>>>>>> from sqlalchemy import *
>>>>>>> s = select(["x", "y"]).select_from("table")
>>>>>>> qlist = [s.limit(10).order_by('x').self_group(),
>>>>>>> s.limit(10).order_by('x').self_group()]
>>>>
>>>>>>> print union_all(*qlist).order_by("foo").limit(10)
>>>> SELECT x, y
>>>> FROM table
>>>> LIMIT 10 UNION ALL SELECT x, y
>>>> FROM table
>>>> LIMIT 10 ORDER BY foo
>>>> LIMIT 10
>>>>
>>>>>>> for q in qlist:
>>>> ...     print q
>>>> ...
>>>> (SELECT x, y
>>>> FROM table ORDER BY x
>>>> LIMIT 10)
>>>> (SELECT x, y
>>>> FROM table ORDER BY x
>>>> LIMIT 10)
>>>>
>>>>
>>>>
>>>> On Fri, Dec 5, 2008 at 4:55 PM, Bo Shi <[EMAIL PROTECTED]> wrote:
>>>>> I had to upgrade to 0.4.7 from 0.4.2, but your sample query works,
>>>>> however, my application of it does not.
>>>>>
>>>>> Sorry I'm being so light on details, I'll try to reproduce with a
>>>>> complete sample versus using snippets of production code.
>>>>>
>>>>> Each select statement is generated like so:
>>>>>
>>>>>  sel = select(pre_select + selectlist,
>>>>> from_obj=join_datatables(tables))
>>>>>
>>>>> I apply self_group() using a list comprehension and if I print each
>>>>> select statement in the list individually, the parentheses show up.
>>>>>
>>>>> If I then union_all(*querylist) and print that, the parentheses
>>>>> disappear.
>>>>>
>>>>> Weird.
>>>>>
>>>>> I should note that the individual selects have filters, an order by
>>>>> clause and a limit, but the following works fine so I would not
>>>>> expect
>>>>> that to be a problem.
>>>>>
>>>>>>>> from sqlalchemy import *
>>>>>>>> s = select(["x", "y"]).select_from("table")
>>>>>>>> print s.self_group()
>>>>> (SELECT x, y
>>>>> FROM table)
>>>>>>>> print union_all(s.self_group(), s.self_group()).order_by("foo")
>>>>> (SELECT x, y
>>>>> FROM table) UNION ALL (SELECT x, y
>>>>> FROM table) ORDER BY foo
>>>>>>>> print union_all(s.limit(10).self_group(),
>>>>>>>> s.limit(10).self_group()).order_by("foo").limit(10)
>>>>> (SELECT x, y
>>>>> FROM table
>>>>> LIMIT 10) UNION ALL (SELECT x, y
>>>>> FROM table
>>>>> LIMIT 10) ORDER BY foo
>>>>> LIMIT 10
>>>>>>>> import sqlalchemy as sa
>>>>>>>> sa.__version__
>>>>> '0.4.7'
>>>>>
>>>>>
>>>>> On Fri, Dec 5, 2008 at 4:23 PM, Michael Bayer <[EMAIL PROTECTED]
>>>>>> wrote:
>>>>>>
>>>>>>
>>>>>>>>> from sqlalchemy import *
>>>>>>>>> s = select(["x", "y"]).select_from("table")
>>>>>>>>> print union_all(s.self_group(), s.self_group()).order_by("foo")
>>>>>> (SELECT x, y
>>>>>> FROM table) UNION ALL (SELECT x, y
>>>>>> FROM table) ORDER BY foo
>>>>>>
>>>>>>
>>>>>> On Dec 5, 2008, at 4:17 PM, Bo Shi wrote:
>>>>>>
>>>>>>>
>>>>>>> Thanks for the quick response!
>>>>>>>
>>>>>>> The following does *not* work.  Am I making the call incorrectly?
>>>>>>>
>>>>>>> sel = union_all(*[q.self_group() for q in querylist])
>>>>>>>
>>>>>>>
>>>>>>> On Fri, Dec 5, 2008 at 4:08 PM, Michael Bayer <[EMAIL PROTECTED]
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>> try calling self_group() on each select object.
>>>>>>>>
>>>>>>>> On Dec 5, 2008, at 3:55 PM, Bo Shi wrote:
>>>>>>>>
>>>>>>>>>
>>>>>>>>> Hi all,
>>>>>>>>>
>>>>>>>>> There appear to be some nuances to using order by statements
>>>>>>>>> with
>>>>>>>>> set
>>>>>>>>> operations like unions in MySQL but the following is allowed*:
>>>>>>>>>
>>>>>>>>> (SELECT a,b from DBA.tbl ORDER BY b LIMIT 5)
>>>>>>>>> UNION ALL
>>>>>>>>> (SELECT a,b from DBB.tbl ORDER BY b LIMIT 5)
>>>>>>>>> ORDER BY b
>>>>>>>>>
>>>>>>>>> When I attempt to generate such a statement with:
>>>>>>>>>
>>>>>>>>> union_all(*list_of_select_objs),
>>>>>>>>>
>>>>>>>>> The SQL generated lacks parentheses around the SELECT
>>>>>>>>> statements (in
>>>>>>>>> addition to dropping the order by clauses, but that appears
>>>>>>>>> to be
>>>>>>>>> expected behavior).  Is there a way to put the parentheses in?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> *just an example, the query i've written is meaningless/
>>>>>>>>> useless :-)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Bo Shi
>>>>>>>>> 207-469-8264
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Bo Shi
>>>>>>> 207-469-8264
>>>>>>>
>>>>>>>>
>>>>>>
>>>>>>
>>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Bo Shi
>>>>> 207-469-8264
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Bo Shi
>>>> 207-469-8264
>>>>
>>>>>
>>>
>>>
>>>>
>>>
>>
>>
>>
>> --
>> Bo Shi
>> 207-469-8264
>>
>> >
>
>
> >
>



-- 
Bo Shi
207-469-8264

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
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