lets take this back to ticket #1840, since I am going to change the approach yet again, and I need Kent to wake up again to ensure his stuff work with the changes too.
http://www.sqlalchemy.org/trac/ticket/1840 On Jul 14, 2010, at 9:28 AM, Rodney wrote: > > On Jul 13, 6:17 pm, Michael Bayer <[email protected]> wrote: >> The handling was changed in 0.6, but we specifically fixed a bunch of things >> related to Decimal in 0.6.2. Oracle doesn't send entirely meaningful >> information regarding the specifics of numeric types in a few cases >> (typically they involve subqueries, it appears you've found another variant >> of it), in those we return Decimal and let SQLA types handle further >> conversion. > > I upgraded from 0.6.1, so the changes in 0.6.2 are the ones that are > affecting me. > >> Are you sure you were getting back integers before, and not floats, for this >> particular statement ? I've observed that cx_oracle seems to choose float() >> in the face of ambiguity. > > "print type (row.col)" produces "<type 'int'>". > >>> and I >>> know that I can convert the data to integers when I reference the >>> columns; however, I'd prefer to deal with the conversion closer to the >>> source. Unfortunately, I can't figure out how to do that though I >>> suspect it's pretty simple. >> >> if you use the Integer type, that will coerce values to integer. > > Yes, but where/how? :-) > >>> So, what's a good way to tell SA about the types of the columns >>> returned by the query? >> >> it depends on what kind of query you are using. func() for example can be >> made to return Integer by passing in type_, func.foo(type_=Integer). text() >> handles it using result_map. Statements derived from Table just do the >> right thing automatically. Its only if you use func()/text() with no >> return type, or execute("string"), that the typing isn't taking place, so >> there is always a way to get Integer in there. > > Okay, here's the general form that I'm currently using... > > t = "SELECT * FROM TABLE (myfunc (:a,:b))" > q = session.query ('COL1", 'COL2", 'COL3').from_statement (t).params > (a=v1,b=v2) > > Hm...your reference to "text()" above led me to this... > > t = text ("SELECT * FROM TABLE (myfunc (:a,:b))", typemap={'COL3': > Integer}) > q = session.query ('COL1", 'COL2", 'COL3').from_statement (t).params > (a=v1,b=v2) > > That seems to do the trick. > > Thanks much. > > Rodney > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to [email protected]. > 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. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to [email protected]. 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.
