On Nov 10, 2006, at 12:13 AM, Daniel Miller wrote:
> This query:
>
> q.select(or_(
> c.orders.items.item_name == 'item#4',
> c.orders.items.item_name == 'item #5'
> ))
>
>
> Should generate something similar to this SQL:
>
> SELECT ...
> FROM users u
> INNER JOIN orders o
> ON u.user_id = o.user_id
> INNER JOIN items i
> ON o.order_id = i.order_id
> WHERE i.item_name = 'item#4'
> OR i.item_name = 'item #5'
>
>
> For the given clause, each occurrence of User.c.orders.items is
> combined into a single join path from users to items, and every
> occurrence of 'item_name' uses the same table alias 'i'. Is that
> too simplistic? Here are a few more examples:
>
its kind of what SQL construction does now, i.e. extracts unique
"FROM" objects from the where criterion and adds them to a list, so
the approach would probably work (might possibly have other issues we
arent thinking of just yet)
>
> Notice how the join path for Users.c.orders is superimposed on the
> join path for Users.c.orders.items. It should be possible to use
> the alias function to force separate joins like this:
>
> q.select(and_(
> c.orders.alias('ox').order_total > 50,
> or_(
> c.orders.alias('o').items.item_name == 'item #4',
> c.orders.alias('o').items.item_name == 'item #5',
> )
> ))
> ....
>
> ASIDE: One thing we might want to change is the 'alias' function.
> Since the 'orders' table may have a column named 'alias', it might
> be better to make it a stand-alone function like this:
>
> alias(c.orders, 'ox')
>
i think this is the problem when you start munging namespaces
together, as opposed to grouping them under explicit prefixes (i.e.
'c'). so far I think this new syntax is going to be confusing to
people since its not explicitly clear what it means underneath (which
leaves people to guess, get it wrong, and then report it as bugs/
confusion), and also presents a completely different way to create
joins when we already have more explicit ways to do it (inlcuding the
selectresults "transformative" style which i think is very fast and
clear). when you start throwing aliases into the mix i think it
becomes more overwhelming.
compare to the current method:
ox = ordertable.alias('ox')
q.select(and_(ox.c.order_total > 50, or_(itemtable.c.item_name=='item
#4', itemtable.c.item_name=='item #5')), from_obj=[users.join
(ordertable).join(itemstable).join(ox, users.c.user_id==ox.c.user_id)])
more explicit...but I think clearer. the user definitely knows what
they are doing when they do this (note that from_obj hasnt really
worked in query() up until version 0.3.0 which is why it looks less
familiar, but i think also aids in creating more complex queries). i
think people should be expressing exactly the joins they want if they
want to be joining at all.
I think your original proposal, i.e. User.c.orders == someorder is
reasonable since its hard to misunderstand what that does.
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---