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