sorry, as_scalar() in 0.4.  in 0.3, correlate() is not generative  
(i.e. modifies the parent select(), returns None), so thats your  
problem (call correlate() beforehand).

On Sep 9, 2007, at 4:03 PM, [EMAIL PROTECTED] wrote:

>
> On Sunday 09 September 2007 22:51:32 Michael Bayer wrote:
>> try calling scalar() on that subquery, it needs to be treated as
>> such.
> oops, forgot to mention: this is 0.3.xx.
> in 0.4 all is okay without scalars.
>
> so, 0.3.latest, adding .scalar() after .correlate() complains about
> None having no .scalar attribute; adding .scalar() before
> the .correlate() gives:
> Traceback (most recent call last):
>   File "tests/convertertest.py", line 144, in
> test4_balance_trans_via_prev_balance_date_subselect
>     b.c.finaldate < balance.c.finaldate
>   File "/home/az/src/dbcook/sqlalchemy/sql.py", line 1215, in scalar
>     return self.execute(*multiparams, **params).scalar()
>   File "/home/az/src/dbcook/sqlalchemy/sql.py", line 1208, in execute
>     return self.compile(bind=self.bind,
> parameters=compile_params).execute(*multiparams, **params)
>   File "/home/az/src/dbcook/sqlalchemy/sql.py", line 1097, in execute
>     raise exceptions.InvalidRequestError("This Compiled object is not
> bound to any Engine or Connection.")
> InvalidRequestError: This Compiled object is not bound to any Engine
> or Connection.
>
> which is true, its all unbound.
>
> btw .scalar() behaves same in 0.4.. so i guess its not that.
>
> if its too much of a hassle, forget it, one testcase less when 0.3
> (-;).
> svilen
>
>> On Sep 9, 2007, at 2:37 PM, [EMAIL PROTECTED] wrote:
>>> g'day.
>>> i have a subselect that may yield null (nothing found), and i
>>> want to treat that as value of 0. i've read about coalesce() that
>>> would return first non-null of its args.
>>>
>>> plain query looks like:
>>>
>>> expr = and_( trans.c.account.startswith( balance.c.account),
>>>           trans.c.date) <= balance.c.finaldate,
>>>           trans.c.date > select( [ func.max( b.c.finaldate)],
>>>                                b.c.finaldate <
>>> balance.c.finaldate ).correlate( balance)
>>>
>>> this gives something like:
>>> $print expr
>>>  trans.account LIKE balance.account+'%' \
>>>  AND trans.date <= balance.finaldate \
>>>  AND trans.date > coalesce((SELECT max(b.finaldate)
>>>  FROM balance AS b
>>>  WHERE b.finaldate < balance.finaldate)
>>>
>>>
>>> adding coalesce breaks the subselect:
>>>
>>> expr = and_( trans.c.account.startswith( balance.c.account),
>>>           trans.c.date) <= balance.c.finaldate,
>>>           trans.c.date > func.coalesce(
>>>                            select( [ func.max( b.c.finaldate)],
>>>                                b.c.finaldate <
>>> balance.c.finaldate ).correlate( balance),
>>>                            0 )
>>> $print expr
>>>  trans.account LIKE balance.account + '%' \
>>>  AND trans.date <= balance.finaldate \
>>>  AND trans.date > coalesce(NULL,0)
>>>
>>> removing the correlate() restores proper subselect, but now its
>>> not correlated, and has 'FROM balance as b, balance' in it...
>>>
>>> or should i use CASE instead?
>>> i'm sure i've misunderstood all this sql thing...
>>> (The subselect is just trying to find the date of previous row in
>>> table balance before current balance.finaldate, OR 0.)
>>>
>>> svilen
>>
>>
>
>
> >


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