On May 23, 2008, at 5:07 PM, Michael Bayer wrote:
>
>> Jeff Putsch wrote:

>> Then I define some selects and execute them:
>>
>> s = select([nis_accounts_table, nis_users_table],
>>          from_obj=[nis_accounts_table.join(nis_users_table)]).where(
>>              nis_users_table.c.eid != ''
>>          )
>>
>> a1 = s.correlate(None).alias()
>> a2 = s.correlate(None).alias()
>>
>> s2 = select([a2.c.domain_id, a2.c.nis_user_id,
>>               a2.c.gid, a2.c.gcos, a2.c.shell, a2.c.home,
>>               a2.c.terminated, a2.c.reassigned_uid, a2.c.active
>>           ], from_obj=[a1.join(a2, (a1.c.eid == a2.c.eid) &
>> (a1.c.uid != a2.c.uid))], use_labels=True)
>>
>> s3 = select([nis_users_table.c.eid], group_by =  
>> nis_users_table.c.eid,
>> having = (func.count(nis_users_table.c.uid) > 1) &
>> (nis_users_table.c.eid != '') &
>> ~(nis_users_table.c.uname.like('%_old')))
>>
>> results = s2.where(a1.c.eid.in_(s3) & (a1.c.domain_id ==
>> 41)).execute().fetchall()
>>
>> What I'd really like is for "results" to contain a list of NisAccount
>> objects.
>>
>> If I run the select like this:
>>
>> NisAccount.query().execute(s2.where(a1.c.eid.in_(s3) &  
>> (a1.c.domain_id
>> == 41))).fetchall()
>
> execute() is a super ancient method that you should not be using
> (that's what all the warnings mean when you call it).    Instead, use
> Query.from_statement(your statement).all().

OK will do. If I understand correctly you're telling me to do
NisAccounts.query().from_statement(...).all()

> The error means that the Query cannot locate one of the necessary
> columns for NisAccount in the row.

That's what I figured.

> In this case I can see that "s2" does not have any column
> corresponding to "nis_accounts.id" in it, so that would be the issue
> here.

I get the same error when I include a2.c.id in "s2". I suspect
it's because of the overriding of statement compilation I'm
doing.

> I would advise trying not to rely upon Query.from_statement() so much
> since it is harder to use.  In this case you could say something along
> the lines of:
>
> query.select_from(a1.join(a2,  
> <onclause>)).filter(a1.c.eid.in_(s3))....

OK. Now here's where my confusion and lack of experience with SQLAlchemy
really starts to kick in....

> Develop this query iteratively, starting simple with core units of the
> desired SQL and working outwards until you get the results you want.

If I understand correctly,
I need to start with "s" (the innermost query) and do something like:

print NisAccount.query().select_from(a1.join(a2, (a1.c.eid ==  
a2.c.eid) & (a1.c.uid != a2.c.uid))).compile()

That gives me the result I expect.

Now, when I add the filter like this:

print NisAccount.query().select_from(a1.join(a2, (a1.c.eid ==  
a2.c.eid) & (a1.c.uid != a2.c.uid))).filter(a1.c.eid.in_(s3) &  
(a1.c.domain_id == 41)).compile()

I get an infinite recursion error.

I assume that I'm on the right track.

> Also I'd recommend giving 0.5 a try which is better suited to this
> level of Query shenanigans.

Perhaps I've got no choice but to try 0.5 :)

I really appreciate your patience and skill in explaining better  
approaches to constructing this type of query using SQLAlchemy.

Thanks,

Jeff.

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