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