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)
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] |