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