PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 26/01/2009 20:59:04

isoman
Membre

inserer une image ?

salut , j'ai une table img qui a la structure suivante :

CREATE TABLE img
(
  "nomImage" character(50) NOT NULL,
  imgbyte bytea,
  CONSTRAINT img_pkey PRIMARY KEY ("nomImage")
)

lorsque j'essaie d'inserer une image avec la requete suivante j'ai une erreur .

INSERT INTO img VALUES ('image test',lo_import('C://test//s1.jpg'));
ERREUR: la colonne « imgbyte » est de type bytea mais l'expression est de type oid
État SQL :42804
Astuce : Vous devez réécrire l'expression ou lui appliquer une transformation de type.

Que faire ?
Merci d'avance.

Hors ligne

#2 26/01/2009 23:35:05

KrysKool
Administrateur

Re : inserer une image ?

Bonsoir

Quelle version de PostgreSQL utilisez vous ?


Christophe Chauvet
Directeur Technique
Sylëam Info Services
Mon site

Hors ligne

#3 27/01/2009 10:10:57

jpargudo
Administrateur

Re : inserer une image ?

Bonjour,

Dans le code de la création de la table, vous devez remplacer le type de données "bytea" par "oid", comme indiqué dans la doc:
http://docs.postgresqlfr.org/8.3/lo-funcs.html

Bonne journée,

Hors ligne

#4 27/01/2009 11:12:43

gleu
Administrateur

Re : inserer une image ?

lo_import ne sert que si vous utilisez des Large Objects. Cette colonne est déclarée comme un bytea, donc pas du tout la même chose.

La première chose à savoir est le type de données que vous voulez gérer. Pour une image, vous avez le choix entre bytea et Large Object. Si vous voulez utiliser les ordres du type lo_import et compagnie, il faut utiliser des Large Objects. Dans ce cas, lire http://docs.postgresql.fr/8.3/largeobjects.html pour les détails. Par contre, si vous voulez que l'image soit stockée dans cette même table en passant par une colonne bytea, vous ne pourrez pas utiliser les fonctions lo_*. Voir http://docs.postgresqlfr.org/8.3/datatype-binary.html pour les détails.


Guillaume.

Hors ligne

#5 27/01/2009 22:37:27

isoman
Membre

Re : inserer une image ?

merci pour vos réponses.
Quel est le type le plus adapté aux images le bytea ou le oid ?

Hors ligne

#6 28/01/2009 00:17:02

gleu
Administrateur

Re : inserer une image ?

Je dirais qu'il est plus facile de maintenir des tables contenant des bytea. Mais, strictement parlant, le bytea et le Large Object sont aussi bien adaptés l'un que l'autre.


Guillaume.

Hors ligne

#7 28/01/2009 20:48:32

isoman
Membre

Re : inserer une image ?

plus facile ?

Hors ligne

#8 29/01/2009 00:24:55

gleu
Administrateur

Re : inserer une image ?

Oui. Un seul exemple. Quand tu veux supprimer une image, tu vas faire un DELETE de la ligne dans ta table. Tout à fait ce qu'il faut faire pour une colonne bytea. Par contre, si tu as une colonne oid qui pointe vers un Large Object, tu dois aussi penser à supprimer le Large Object.

Autre problème : il faut pouvoir vacuumer la table système qui contient tous les Larges Objects.

Bref, que des détails ainsi mais qui rendent la vie difficile lorsqu'on utilise les Large Objects. (À noter les modules contrib lo et vacuumlo qui cherchent à faciliter les choses, mais avec un bytea, pas besoin de tout ça)


Guillaume.

Hors ligne

#9 29/01/2009 10:40:23

isoman
Membre

Re : inserer une image ?

Ok, j'ai remplacé les oid par des bytea mais j'ai pas trouvé l'équivalent des fonctions lo_import et lo_export dans la doc, pouvez m'aider svp?

Dernière modification par isoman (29/01/2009 10:40:40)

Hors ligne

#10 29/01/2009 12:16:32

gleu
Administrateur

Re : inserer une image ?

Ce type de champ se gère comme les autres. Il n'y a pas de fonctions spéciales pour ça.


Guillaume.

Hors ligne

#11 29/01/2009 13:43:56

isoman
Membre

Re : inserer une image ?

je vais formuler la question autrement, si je veux insérer une image dans un champ bytea avec une requete sql dans pgAdmin 3 ,j'utilise quelle fonction pour designer la source de l'image ?

Hors ligne

#12 29/01/2009 14:37:21

gleu
Administrateur

Re : inserer une image ?

Ce n'est pas possible avec ce type de champ car il faut exécuter une requête du type :

INSERT INTO ta_table (le_champ_bytea) VALUES ('le contenu du fichier image');


Guillaume.

Hors ligne

#13 29/01/2009 23:36:31

isoman
Membre

Re : inserer une image ?

supposons que je travaille avec un serveur distant , si j'utilise le oid pour stocker un objet a partir du client , est ce que l'objet en entier est transmis au serveur ou le champ oid va pointer vers le fichier du client ?
Merci d'avance.

Hors ligne

#14 30/01/2009 00:15:32

gleu
Administrateur

Re : inserer une image ?

Le fichier entier est transmis. C'est vrai pour un Large Object comme pour un bytea. La seule différence est qu'il existe des fonctions PostgreSQL pour envoyer le fichier vers un Large Object, alors qu'il faut utiliser les fonctions du langage utilisé pour lire le fichier puis l'intégrer dans un bytea.


Guillaume.

Hors ligne

Pied de page des forums