Could cast be defined to allow string values (i.e. cast(...,
"Numeric(14,2)")?  This would fix my problem.   Guess I will check the code
and see.

On Sun, Mar 22, 2009 at 12:00 PM, Shawn Church
<sh...@schurchcomputers.com>wrote:

>
>
> On Sun, Mar 22, 2009 at 8:17 AM, Michael Bayer 
> <mike...@zzzcomputing.com>wrote:
>
>>
>> theres three layers to this issue.   the first is, yes as_scalar() is
>> trying to compile the expression which I don't think there's a very
>> good reason, so ill likely commit a change for that (it will result in
>> a behavioral change regarding the namespace of "someselect.c" but im
>> hoping not one anyone was relying upon that).
>
>
> Sounds good
>
>
>> the second layer is,
>> if you're casting against  a constant value like below, or a column on
>> the Order class, you don't need the select() - just say
>> cast(...).label('foo') -
>
>
> I'm not casting a constant (see below).  I just simplified the expression
> until I found the specific function causing the error.
>
> however, convenient operations like "print
>> query" still wont work since they evaulate the cast() without a
>> dialect.
>
>
> I like using print for debugging but I can live without it.
>
>
>> the third is, the whole "cast can't compile without a
>> dialect" thing is going away in 0.6, but I can't make it work in 0.5
>> without major changes.
>>
>> One particular workaround that would totally eliminate the issue until
>> 0.6 comes out would be to use the dialect-specific type for now, i.e.
>> MSNumeric (mysql), PGNumeric (postgres), SLNumeric (sqlite).
>>
>>
> I'm using SQLIte for unit tests and MySQL for production so I can't see a
> way to do this.
> I found that I CAN cast the result of the select (references OrderLine
> table, not shown):
>
> def IF(condition, true, false):
>     return case([(condition, true)], else_ = false)
>
>
> class Order(Base):
>
>    -- Skipping Column Definitions --
>
>     L = OrderLine
>
>     taxable = column_property(
>         cast(select([func.sum(IF(L.taxable, L.quantity * L.price, 0))],
>                 L.order_id == id).as_scalar(),
> Numeric(14.2)).label("taxable"))
>
>
> This isn't really the same thing because the float would be rounded after
> the sum not line by line.  I think I could also use sum(... type_ =
> Numeric(14,2)) for the same result.  Am I missing an easier way to do this?
>
>
>>
>>
>> On Mar 22, 2009, at 6:27 AM, Shawn Church wrote:
>>
>> > >>> import sqlalchemy
>> >     >>> sqlalchemy.__version__
>> >     '0.5.2'
>> >
>> >     >>> from sqlalchemy import *
>> >     >>> from sqlalchemy.orm import relation, column_property,
>> > sessionmaker
>> >
>> >     >>> from sqlalchemy.ext.declarative import declarative_base
>> >     >>> Base = declarative_base()
>> >     >>> Session = sessionmaker()
>> >
>> >     >>> class Order(Base):
>> >     ...    __tablename__ = "orders"
>> >     ...
>> >     ...    id = Column(Integer, primary_key = True)
>> >     ...
>> >     ...    test = column_property(select([cast(1,
>> > Numeric(14,2))]).label("test"))
>>
>>
>> >>
>>
>

--~--~---------~--~----~------------~-------~--~----~
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 
sqlalchemy+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to