sacha wrote: > > I really want to get a clear vision. > > So, I have a table x and mapped class X. > I can use query(X) for simple queries, can I query(X) for structured > ones like > SELECT * FROM x WHERE x.a IN (SELECT ....)
sel = session.query(X.a).filter(X.b=='foo') session.query(X).filter(X.a.in_(sel)) > Same about multi-cartesian product can I use query(X).join(....) > for SELECT * FROM x JOIN x JOIN x ..... > ? > for self-referential, use aliases as follows: x1 = aliased(X) x2 = aliased(X) x3 = ... session.query(X).join((x1, X.somerelation), (x2, x1.somerelation), ...) or session.query(X).join((x1, X.some_id==x1.some_other_id), (x2, x1.some_id==x2.some_other_id), ...) anything can be in query() too, i.e. query(X, x1, x2.foo, ...) then .filter(X.foo=='bar').filter(x1.bar=='bat').filter(x2.hoho=='lala') etc. > > > On Jun 19, 12:03 pm, "Michael Bayer" <[email protected]> wrote: >> sacha wrote: >> >> > Michael, >> >> > do you mean, that subqueries could not be wrapped into sqlalchemy? >> >> you talked about "mapping" to a select statement. "mapping" means this: >> >> m = mapper(MyClass, someselectable) >> >> mapping like the above is usually done against individual tables, and >> usually once per class per application. You can do it against select() >> statements but this is usually unnecessary. You can also make multiple >> mappers for a single class in an ad-hoc way, but again this is an >> ancient >> use case that is much better addressed by using the Query object as >> needed. >> >> > what should be the arguments to join() I failed to figure out? how do >> > I reference different instances of seq in fileter() after? >> >> Usually you use query.join(). Self referential queries require an >> alias >> for each join target. There is an example >> athttp://www.sqlalchemy.org/docs/05/ormtutorial.html#using-aliases. >> Also >> the example I mentioned earlier in examples/elementtree/optimized_ai.py >> shows exactly a dynamically-constructed self-referential join. >> >> >> >> > Thanks, >> > A >> >> > On Jun 19, 7:43 am, "Michael Bayer" <[email protected]> wrote: >> >> >> you can map to any select(), but since the statement here is a >> runtime >> >> thing just map to the "seq" table normally and use Query as needed to >> >> construct the joins and filter criterion. If you're looking to >> >> automate >> >> adding N joins, just build a function that calls query.join() the >> >> appropriate number of times. For an example of a completely >> different >> >> use case where a self-referential query.join() is being called an >> >> arbitrary number of times, see the elementtree/optimized_al.py >> example >> >> in >> >> the distribution. > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to [email protected] 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 -~----------~----~----~----~------~----~------~--~---
