[Python] psycopg2 e bytea

Stefano Dal Pra s.dalpra a gmail.com
Mar 15 Feb 2011 15:36:03 CET


saluti, sto tentando di inserire un valore bytea in una tabella di un db
postgres 8.4.7
usando psycopg2 2.2.1-1 (Python 2.6.6) e ottengo un errore. Se qualcuno ha
lumi mi puo' suggerire
il suo parere?

Descrivo il problema:

# carico un'immagine
>>> mypic=open('/home/sdp/testpic.png','r').read()

# provo a inserirla con psycopg2
>>> q.curs.execute("insert into blobs (name,file) values (%s,%s)",('UN nome
a caso',mypic,))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
psycopg2.DataError: invalid byte sequence for encoding "UTF8": 0xff
HINT:  This error can also happen if the byte sequence does not match the
encoding expected by the server, which is controlled by "client_encoding".

I miei tentativi di convertire a utf8 falliscono miseramente. Per esempio:
>>> s=unicode(mypic,'UTF-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0:
invalid start byte


Provo ancora:
>>> s=unicode(mypic,'LATIN9')
>>> su8=s.encode('UTF-8')

Wow! Questo non da errore!
>>> len(mypic) , len(su8)
(13401, 19961)

lunghezze diverse, per via della diversa codifica... ok, ci puo' stare;
E allora proviamo a inserire adesso:

>>> q.curs.execute("insert into blobs (name,file) values (%s,%s)",('UN nome
a caso',su8))
>>> q.conn.commit()

Ok, no errori...
Proviamo a leggere il dato allora:

>>> q.curs.execute("select file from blobs")
>>> T2=q.curs.fetchone()
>>> T2
(<read-only buffer for 0xb739ad80, size 16, offset 0 at 0xb6ad04e0>,)
>>> dir(T2[0])
['__add__', '__class__', '__cmp__', '__delattr__', '__delitem__',
'__delslice__', '__doc__', '__format__', '__getattribute__', '__getitem__',
'__getslice__', '__hash__', '__init__', '__len__', '__mul__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__',
'__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__']

quel size 16 mi inquieta, vediamo da postgres cosa dice:

=> select name,file from blobs;
      name      |
file
----------------+------------------------------------------------------------------
 UN nome a caso |
\303\203\302\277\303\203\302\230\303\203\302\277\303\203\302\240
(1 riga)

Io per ora mi arrendo; se avete idee... Grazie in anticipo

Stefano
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20110215/421af1d6/attachment.html>


Maggiori informazioni sulla lista Python