On Apr 19, 2007, at 9:39 AM, Gaetan de Menten wrote:

> By the way, lately I've been wishing SQLAlchemy would add a column
> (and possibly its table) automatically to the select clause if I do an
> order by a column which is not in the currently selected columns.
>
> I mean that you could write:
>
> query(System).select(System.c.lastseen > self.this.week,
> order_by=[client.c.name])
>
> and it would figure out that the client.c.name is not in the
> selection, and would add it (or rather would add the join you describe
> above).
>

I would agree up to the point that the table gets added, which is  
what happens if you add columns to the SELECT clause of a select; the  
table gets appended to the FROM clause.  but i dont agree in creating  
JOIN objects automatically with no explicit specification that that's  
whats desired (as usual, i am open to all sorts of explicit methods  
of specifications...although we have plenty for specifying "join on a  
relationship" at this point).

the query above I would express generatively as:

query(System).filter(System.c.lastseen > self.this.week).order_by 
(client.c.name).join('clients').list()

Maybe it would also be handy to have join() accept a Table as well as  
a Class argument, and have it figure out the auto-thing in those  
cases as well.  all that is fine with me (since theres no other  
meaning you could get from join(SomeOtherClass) ).

>
> When using, the "SQL" layer of SQLAlchemy, I don't mind having to
> write the joins myself. But when using the ORM, I'd expect this to be
> done for me. And it would be even better if this worked also for
> relations and mappers. The use case I am most interested in (and I
> haven't found a nice solution for it yet) is the order_by argument for
> mappers.

>
> Yes, I know, that would mean I'd always have a join whenever I select
> from that mapper. Strange use case, but well, I need to do that
> sometimes.

The key phrase here is "sometimes".  Lets talk about all those pesky  
other times.  assume autojoins.

        MyClass-> table1

        query(MyClass).select(table2.c.name=='foo')

query:

        select * from table1 JOIN table2 on table1.t2id=table2.id
        WHERE table2.name='foo'

Now, i want this query:

        select * from table1, table2 where
        table2.foobar > table1.lala and table2.name='foo'

How ?

should I parse through the criterion and "guess" when i detect a join  
condition between table1 and table2, and thereby remove the auto- 
condition ?  (arent we supposed to refuse that temptation?)

well what about this query:

        select * from table1, table2, table3 where
        table2.foobar > table3.hoho and table3.xfactor=table1.id and  
table2.name='foo'

Now theres *no* direct join between table1 and table2.  Do i add the  
autojoin ?   do i have to figure out that it joins through some other  
path ?  what kind of algorithm is going to work in all cases  
considering how complex SQL can get ?  what if theres no path between  
t1 and t2 at all (and thats what someone wants) ?

cant we just agree that adding the join automatically is an egregious  
case of implicit over explicit ?    considering that it is *so*  
*easy* to join on a relationship now:

        query(MyClass).join('somerelation').select(table2.c.name=='foo')

>
>> there is a way to get extra columns in the "SELECT" clause of a
>> mapper query in the most recent version of SA but thats not what
>> youre looking for here.
>
> Or is what I describe possible by using what you say in the above  
> paragraph????

i was referring to a new method add_column() which is used to affect  
the way you get the results back (as tuples which contain objects and  
scalars).




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

Reply via email to