Strings and % sign fails - Help Please

S

siasookhteh

I also posted this in Django Users group, but figured it probably has
more relevance for python group.

It seems like a freak problem to me. I spent a long hour to track the
problem down and here it is:

The following statement fails because it has the '%' sign in it.
cursor.execute("select '%'")

The error is: IndexError: list index out of range

How do I address this problem?

Please note that the following work just fine:
cursor.execute("select 'x'")

and the following also fails with the same error:
cursor.execute("""select '%'""")
cursor.execute("select '\%'")

astr = "select '\%'"
cursor.execute(astr)

I greatly appreciate all helps,
Regards,
Sia
 
J

Jorge Godoy

The following statement fails because it has the '%' sign in it.
cursor.execute("select '%'")

The error is: IndexError: list index out of range

How do I address this problem?

Use "%%".


--
Jorge Godoy <[email protected]>

"Quidquid latine dictum sit, altum sonatur."
- Qualquer coisa dita em latim soa profundo.
- Anything said in Latin sounds smart.
 
S

siasookhteh

heh.. It works except I am using psycopg.Binary(somebinarystructure),
and I am not really doing it by hand to just add the extra %, and
psycopg.Binary doesn't do it. I'd imagine it's a bug with psycopg
package. Any quick way to project a string from freak '%' problems?

Thanks,
Sia
 
J

Jorge Godoy

heh.. It works except I am using psycopg.Binary(somebinarystructure),
and I am not really doing it by hand to just add the extra %, and
psycopg.Binary doesn't do it. I'd imagine it's a bug with psycopg
package. Any quick way to project a string from freak '%' problems?

Try using r"string '%'"...

--
Jorge Godoy <[email protected]>

"Quidquid latine dictum sit, altum sonatur."
- Qualquer coisa dita em latim soa profundo.
- Anything said in Latin sounds smart.
 
J

Jorge Godoy

Erik Max Francis said:
Raw strings don't have anything to do with format specifiers.

I know. I'm just trying to see if there might be some magic going on with his
driver...

--
Jorge Godoy <[email protected]>

"Quidquid latine dictum sit, altum sonatur."
- Qualquer coisa dita em latim soa profundo.
- Anything said in Latin sounds smart.
 
E

Erik Max Francis

Jorge said:
I know. I'm just trying to see if there might be some magic going on with his
driver...

Since raw strings have no effect on format specifiers, that won't tell
you anything.
True

His problem is that cursor.execute does format expansion with %, so a
single % is not legal.
 
C

Christoph Zwerschke

Erik said:
His problem is that cursor.execute does format expansion with %, so a
single % is not legal.

Yes, I think psycopg uses paramstyle='pyformat', i.e. it expands
parameters in your sql in the usual Python way where % has a special
meaning. If you really mean the % sign only, use %%.

-- Christoph
 
F

Fredrik Lundh

heh.. It works except I am using psycopg.Binary(somebinarystructure),
and I am not really doing it by hand to just add the extra %, and
psycopg.Binary doesn't do it. I'd imagine it's a bug with psycopg
package.

or a bug in your use of Binary. what exactly are you applying Binary
to, and how do you pass the resulting adapter to execute ?

</F>
 
S

Siah

Problem Solved. The problem was with psycopg.Binary whose mere job is
to convert bytes into clear text for sql statement. I'll be filing a
bug.

Thanks everyone,
Sia
 
F

Fredrik Lundh

Siah said:
Problem Solved. The problem was with psycopg.Binary whose mere job is
to convert bytes into clear text for sql statement.

no, its job is to wrap strings that contain binary blobs, so that data binding
works properly. you're supposed to do

cursor.execute(statement, Binary(data))

and not

cursor.execute(Binary(statement))

or

cursor.execute("some statement %s" % Binary(statement))

or some other sillyness. it's an object wrapper, not an escape function for
arbitrary SQL. Python's not PHP.

for more details, see "Type Objects and Constructors" on this page

http://www.python.org/dev/peps/pep-0249/

</F>
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Staff online

Members online

Forum statistics

Threads
474,291
Messages
2,571,453
Members
48,135
Latest member
papaoso

Latest Threads

Top