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