volx wrote:
>
> cx_Oracle actually has thread on that a topic at
> http://sourceforge.net/mailarchive/message.php?msg_id=47BED8B8.3983.00E5.0%40uwinnipeg.ca
>
> It boils down to having to specify a type for input parameter. Is that
> something I could "plug-in" as a decorator or would that need to be
> hacked on SqlAlchemy level?

here is the thing.  We call setinputsizes() with oracle.  So perhaps
OracleChar() needs to have dbapi.FIXED_CHAR established as its
get_dbapi_type().   would you care to try monkeypatching this (in 0.5, the
fix for 0.6 would be different) ?

class OracleChar(sqltypes.CHAR):
    def get_col_spec(self):
        return "CHAR(%(length)s)" % {'length' : self.length}

    def get_dbapi_type(self, dbapi):
        return dbapi.FIXED_CHAR

from sqlalchemy.databases import oracle
oracle.OracleChar = OracleChar




>
> Here's how:
>
> In [70]: query = "select * from price_sources where description
> = :someparam"
> In [71]: cursor.setinputsizes(someparam=cx_Oracle.FIXED_CHAR)
> Out[71]: {'someparam': <cx_Oracle.FIXED_CHAR with value None>}
> In [72]: cursor.execute(query, dict(someparam='EJV')).fetchall()
> Out[72]:
> [(149,
>
> 'EJV
> ')]
>
> Any help would be appreciated.
>
>
> On Sep 30, 2:36 pm, volx <victor.o...@gmail.com> wrote:
>> I have just now and it looks that this post probably belongs on
>> cx_Oracle mailing list.
>>
>> In [47]: cursor.execute("select * from price_sources where desciption
>> = :someparam", dict(someparam='EJV')).fetchall()
>> Out[47]: []
>> In [49]: cursor.execute("select * from price_sources where desciption
>> = :someparam", dict
>> (someparam='EJV
>> ')).fetchall()
>> Out[49]:
>> [(149,
>>
>> 'EJV
>> ')]
>>
>> On Sep 30, 2:18 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
>>
>> > On Sep 30, 2:07 pm, volx <victor.o...@gmail.com> wrote:
>>
>> > > Hello all:
>>
>> > > Consider table:
>>
>> > > CREATE TABLE PRICE_SOURCES (
>> > >    ID decimal(22) PRIMARY KEY NOT NULL,
>> > >    DESCRIPTION char(100) NOT NULL
>> > > )
>>
>> > > and this screen dump from ipython session:
>>
>> > > In [28]: import cx_Oracle
>> > > In [29]: from sqlalchemy.ext.sqlsoup import SqlSoup
>> > > In [30]: con = cx_Oracle.connect('myuser/myp...@mydb')
>> > > In [31]: cursor = con.cursor()
>> > > In [32]: cursor.execute("select * from price_sources where
>> description
>> > > = 'EJV'").fetchall()
>> > > Out[32]:
>> > > [(149,
>>
>> > > 'EJV
>> > > ')]
>>
>> > > Note that the result has padding in the column "description" as it
>> is
>> > > of type CHAR(100), with is fixed length.
>>
>> > > Now, let's do the same in SqlAlchemy.
>>
>> > > In [33]: soup = SqlSoup('oracle://myuser:myp...@mydb')
>> > > In [34]: soup.price_sources.filter_by(description='EJV').all()
>> > > Out[34]: []
>>
>> > > As you can see it returns zero rows. Only after I pad the parameter
>> > > for where clause will I get my row back:
>>
>> > > In [35]: soup.price_sources.filter_by
>> > > (desciption='EJV
>> > > ').all()
>> > > Out[35]: [MappedPrice_sources(pricesource=Decimal
>> > > ('149'),desciption='EJV
>> > > ')]
>>
>> > > The same behavior happens even if I use ORM and regardless whether
>> the
>> > > column metadata is defined with String, OracleString or CHAR.
>>
>> > > I can understand the query result being padded as it is consistent
>> > > with behavior everywhere but the where clasues must not. It is a big
>> > > problem if you try to use session.merge() because you have to pad
>> > > contents of object fields otherwise the ORM will insert a duplicate.
>>
>> > > Please help. I hope I am doing something wrong or missing something.
>>
>> > that's a little strange.  have you tried:
>>
>> > In [28]: import cx_Oracle
>> > In [30]: con = cx_Oracle.connect('myuser/myp...@mydb')
>> > In [31]: cursor = con.cursor()
>> > In [32]: cursor.execute("select * from price_sources where description
>> > = :someparam", dict(someparam='EJV')).fetchall()
>>
>> > ?
>>
>> > since the usage of bind parameters is how it actually runs.  If same
>> > behavior there then it's a cx_oracle behavior.    you can verify this
>> > by turning on SQL echoing.  As a workaround you can build yourself a
>> > TypeDecorator that elongates/truncates incoming strings though that
>> > seems a little inconvenient.
> >
>


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