[Python] psycopg2 e bytea

Daniele Varrazzo piro a develer.com
Mer 16 Feb 2011 17:44:20 CET


On Wed, 16 Feb 2011 17:23:00 +0100, Stefano Dal Pra <s.dalpra a gmail.com>
wrote:
> Scusa, mi e' partito un send a vuoto sfiorando la tastiera; non so come
sia
> successo...
> Magari riscrivo meglio appena posso.

No problem. Intanto rispondo a questa mezza domanda...


>> Quel che mi chiedo io e': dopo un connect psycopg2 conosce tipi di dato
> delle tabelle in cui va ad inserire?
> Se cosi' fosse pensare ad un

No, non li conosce: psycopg non fa introspezione dei tipi di dati o delle
tabelle in connessione.

Mi sono spiegato male io nel messaggio di prima. Quando psycopg converte
da oggetti python a sintassi sql (adapt), usa il tipo *python*, e solo
quello, per decidere quale regola (quale adapter) usare. Il tipo di dato
postgres di destinazione non è preso in considerazione. Entrambi i problemi
che hai incontrato (adattare Python str a Postgres bytea invece di text,
adattare Python int a Postgres bool invece di tipi numerici) derivano da
questa informazione incompleta, e dal fatto che questi tipi normalmente
vengono mappati non nei tipi che intendevi tu (la mappa degli adapter può
essere personalizzata, ma è globale quindi se usi l'adapter bool per
convertire gli interi poi non sarai in grado momentaneamente di inserire
interi nel database, il che potrebbe essere un problema...)

Non è un problema risolvibile a livello di psycopg perché questo è un
driver generico: non parsa un'istruzione sql per capire che si tratta di un
insert e in quale tabella per quindi andare a vedere i dati di
destinazione: inserire dati in una tabella è solo uno dei possibili
obiettivi dell'eseguire una query e non sempre il tipo di dato di
destinazione è un'informazione facilmente raggiungibile. In casi specifici
come il tuo ("insert into <table> values (...)") puoi costruirti uno
strumento apposito data la semplicità del compito, ma questa non è una
possibilità generale.

-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com


Maggiori informazioni sulla lista Python