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 30/03/2010 17:25:38

troycanneda
Membre

Stocker/lire du binaire par requete sql

Bonjour,

Je souhaite stocker des petits fichiers (fichier image, fichier texte) dans ma base.
J'envisage d'utiliser un champ de type bytea, puisque mes fichiers sont relativement petits (<300ko).
Par contre, je n'arrive pas à trouver une solution/fonction pour écrire/lire directement ce type de données en sql.
A savoir, je voudrais insérer ce type de données directement via un insert...l'idéal serait d'avoir une fonction qui chargerait directement à partir d'un chemin : ex -> insert into matable values (file_to_area("c:\monfichier.txt"))

idem en lecture pour recuperer le flux binaire.

J'espère m'être fait comprendre ;-)

Je travaille en delphi avec les composants d'accès Bdd Zeos Access : j'ai une solution de repli par une solution basée sur le edit/post (voir ci-dessous), mais je préfèrerait une solution full sql

[
    if Dataset.State <> dsEdit then
      Dataset.Edit;

    BlobStream := Dataset.CreateBlobStream(
      Dataset.FieldByName(edtBlobColumn.Text), bmWrite);
    try
      FileStream := TFileStream.Create(dlgOpenFile.FileName, fmOpenRead);
      try
        BlobStream.CopyFrom(FileStream, FileStream.Size);
      finally
        FileStream.Free;
      end;
    finally
      BlobStream.Free;
    end;

    Dataset.Post;
]

A vous lire
D'avance merci.

Hors ligne

#2 30/03/2010 17:29:46

gleu
Administrateur

Re : Stocker/lire du binaire par requete sql

La lecture du fichier peut se faire via une requête SQL mais cela sous-entend que le fichier est lisible par l'utilisateur postgres et donc qu'il se trouve sur le serveur PostgreSQL.


Guillaume.

Hors ligne

#3 30/03/2010 17:36:00

troycanneda
Membre

Re : Stocker/lire du binaire par requete sql

gleu a écrit :

La lecture du fichier peut se faire via une requête SQL mais cela sous-entend que le fichier est lisible par l'utilisateur postgres et donc qu'il se trouve sur le serveur PostgreSQL.

Merci de votre réponse très rapide, mais pourriez vous être plus explicite ?
A la lecture de ce post (http://forums.postgresql.fr/viewtopic.php?id=146), il semble que cela ne soit pas possible d'écrire ce type de donnée via un insert pur : Vous confirmez qu'il n'existe aucune fonction spécifique ?

Hors ligne

#4 30/03/2010 20:01:17

gleu
Administrateur

Re : Stocker/lire du binaire par requete sql

Il est possible d'utiliser une fonction (que vous devrez écrire car elle n'existe pas) pour lire des données binaire d'un fichier et les placer dans un champ de type bytea. Ça donnerait une requête du type :

INSERT INTO la_table (la_colonne_bytea) VALUES (la_fonction('/chemin/vers/fichier'));

Mais comme je le disais, cette fonction n'existe pas, il faut l'écrire. De plus, cette fonction étant exécutée côté serveur, elle ne pourra accéder qu'à un fichier présent sur le serveur et il faudra que l'utilisateur postgres ait le droit d'accéder à ces fichiers.

Autrement dit, il est bien plus simple que l'applicatif lise lui-même le fichier binaire, stocke tout ça dans une variable et renvoie le tout dans une requête du type :

INSERT INTO la_table (la_colonne_bytea) VALUES ('les données binaires');

Guillaume.

Hors ligne

#5 30/03/2010 21:54:34

troycanneda
Membre

Re : Stocker/lire du binaire par requete sql

gleu a écrit :

Autrement dit, il est bien plus simple que l'applicatif lise lui-même le fichier binaire, stocke tout ça dans une variable et renvoie le tout dans une requête du type :

INSERT INTO la_table (la_colonne_bytea) VALUES ('les données binaires');

Entièrement d'accord : on en revient à ma question initiale , quelle syntaxe sql pour ce type d'insert ? ce que vous mettez dans 'les données binaires' doit correspondre à quoi : une simple chaine de caractères correspondant au fichier ? on aurait donc un truc du style :

INSERT INTO la_table (la_colonne_bytea) VALUES ('zs&é<"@drflc;p)9'), 'zs&é<"@drflc;p)9' étant la représentation caracteres du fichier, tout simplement ? Dans ce cas là, quel intérêt de stocker dans un champ de type bytea, et pas un champ de type text ? Optimisation de l'espace ?

merci

Hors ligne

#6 30/03/2010 23:18:09

gleu
Administrateur

Re : Stocker/lire du binaire par requete sql

Pour stocker dans un champ text, il faut respecter l'encodage indiquée au niveau de la base. Donc stocker des données binaires dans un champ text ne fonctionnera pas si la donnée binaire ne correspond pas à un code accepté par l'encodage.

Autrement dit, utiliser un bytea permet de stocker des octets comme 0x00. Pour stocker ces informations, il faut réaliser un « échappement » des données. C'est le pilote qui fournit ça. Par exemple, en PHP, il faut utiliser la fonction pg_escape_bytea. Sur d'autres langages, elle aura un autre nom.


Guillaume.

Hors ligne

#7 30/03/2010 23:26:31

troycanneda
Membre

Re : Stocker/lire du binaire par requete sql

gleu a écrit :

Pour stocker dans un champ text, il faut respecter l'encodage indiquée au niveau de la base. Donc stocker des données binaires dans un champ text ne fonctionnera pas si la donnée binaire ne correspond pas à un code accepté par l'encodage.

Autrement dit, utiliser un bytea permet de stocker des octets comme 0x00. Pour stocker ces informations, il faut réaliser un « échappement » des données. C'est le pilote qui fournit ça. Par exemple, en PHP, il faut utiliser la fonction pg_escape_bytea. Sur d'autres langages, elle aura un autre nom.

Ok. Merci beaucoup pour ces explications précises... Je vais me mettre en quête de la solution en Delphi. Merci aussi pour votre promptitude.

Hors ligne

#8 18/08/2010 16:46:41

nanou86
Membre

Re : Stocker/lire du binaire par requete sql

Bonjour,

Je suis à la recherche de l'équivalent en C de cette merveilleuse fonction qu'est pg_escape_bytea mais je ne la trouve pas... Je dois surement être fatigué car elle ne doit pas être bien difficile à trouver... mais bref si quelqu'un l'a déjà rencontré ou utilisé qu'il n'hésite pas à me faire signe smile

A bientôt

Hors ligne

#9 18/08/2010 17:19:47

nanou86
Membre

Re : Stocker/lire du binaire par requete sql

Autant pour moi j'ai réussi à me réveiller et à trouver dans les fonctions de libpq celle qui fera mon bonheur : PQescapeByteaConn

A bientôt !

Hors ligne

Pied de page des forums