Re: [posgresql bytea]

From: "Daniel Verite" <daniel(at)manitou-mail(dot)org>
To: "pierre crumeyrolle" <pierre(dot)crumeyrolle(at)c-s(dot)fr>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: [posgresql bytea]
Date: 2014-02-24 12:10:58
Message-ID: ba2ad5ff-b1e6-4c71-a1ab-9d6fe4288963@mm
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

pierre crumeyrolle wrote:

> ok merci mais j'ai un ERROR COPY file signature not recognized avec
> l'option BINARY
> copy TABLE_BYTEA from '/NFS/blobextract' BINARY

Oui le format binaire pour COPY est spécifique, il comprend une entête et une
fin de fichier. En fait il est plutôt fait pour relire des données
précédemment écrites avec COPY TO.
Voir le chapitre Format binaire dans la doc:
http://docs.postgresql.fr/9.3/sql-copy.html

D'une manière générale le type BYTEA est gérable dans les langages de
programmation mais pas tellement avec les outils en ligne de commande du
genre psql.

On peut quand même s'en sortir en passant par un "large object" intermédiaire
qui lui en revanche a toute l'API nécessaire pour être importé/exporté en
fichier.

Etape 1 sous psql

\lo_import '/chemin/vers/fichier-binaire'

Ca va sortir un résultat du genre
lo_import 123456

où 123456 est l'OID référent de l'objet. Garder ce nombre.

Etape 2: créer (une fois pour toutes) une fonction de conversion dont voici
un exemple fonctionnel:

CREATE FUNCTION lo_to_bytea(oid) RETURNS bytea
AS $$
declare
fd integer;
sz integer;
contents bytea;
begin
fd = lo_open($1,262144);
if (fd<0) then
raise exception 'Failed to open large object %', $1;
end if;
sz=lo_lseek(fd,0,2);

perform lo_lseek(fd,0,0);
contents = loread(fd,sz);
if (lo_close(fd)!=0) then
raise exception 'Failed to close large object %', $1;
end if;
return contents;
end;
$$ LANGUAGE plpgsql;

Etape 3:

INSERT INTO nom_table(nom_colonne_bytea)
SELECT lo_to_bytea(123456);

où 123456 est biensûr l'OID précédemment importé

Etape 4: supprimer le large object

\lo_unlink 123456

Cordialement,
--
Daniel

--
Envoi via la liste pgsql-fr-generale (pgsql-fr-generale(at)postgresql(dot)org)

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message pierre crumeyrolle 2014-02-24 13:12:24 Re: [posgresql bytea]
Previous Message pierre crumeyrolle 2014-02-24 10:13:04 Re: [posgresql bytea]