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