2009-05-18 5 views
1

Comment insérer un fichier texte dans un champ dans PostgreSQL?Comment insérer un fichier texte dans un champ dans PostgreSQL?

Je voudrais insérer une ligne avec des champs d'un fichier texte local ou distant.

J'attends une fonction comme gettext() ou getURL() pour effectuer les opérations suivantes:

% INSERT INTO collection (id, chemin, contenu) VALUES (1, '/ etc/motd' , gettext ('/ etc/motd'));

-S.

Répondre

1

Merci pour les conseils. J'ai trouvé une autre réponse avec une fonction intégrée. Vous devez avoir les droits super utilisateur pour l'exécuter!

-- 1. Create a function to load a doc 
-- DROP FUNCTION get_text_document(CHARACTER VARYING); 
CREATE OR REPLACE FUNCTION get_text_document(p_filename CHARACTER VARYING) 
    RETURNS TEXT AS $$ 
    -- Set the end read to some big number because we are too lazy to grab the length 
    -- and it will cut of at the EOF anyway 
    SELECT CAST(pg_read_file(E'mydocuments/' || $1 ,0, 100000000) AS TEXT); 
$$ LANGUAGE sql VOLATILE SECURITY DEFINER; 
ALTER FUNCTION get_text_document(CHARACTER VARYING) OWNER TO postgres; 

-- 2. Determine the location of your cluster by running as super user: 
SELECT name, setting FROM pg_settings WHERE name='data_directory'; 

-- 3. Copy the files you want to import into <data_directory>/mydocuments/ 
-- and test it: 
SELECT get_text_document('file1.txt'); 

-- 4. Now do the import (HINT: File must be UTF-8) 
INSERT INTO mytable(file, content) 
    VALUES ('file1.txt', get_text_document('file1.txt')); 
+0

Ack. Formatage –

0

Vous ne pouvez pas. Vous devez écrire un programme qui lira le contenu du fichier (ou les URL) et le stockera dans le champ désiré.

3

La méthode la plus simple consisterait à utiliser l'un des langages de script intégrables. Voici un exemple en utilisant plpythonu:

 
CREATE FUNCTION gettext(url TEXT) RETURNS TEXT 
AS $$ 
import urllib2 
try: 
    f = urllib2.urlopen(url) 
    return ''.join(f.readlines()) 
except Exception: 
    return "" 
$$ LANGUAGE plpythonu; 

Un inconvénient de cet exemple est fonction de sa dépendance à l'égard urllib2 signifie que vous devez utiliser « file: /// » URL pour accéder à des fichiers locaux, comme ceci:

select gettext ('fichier: /// etc/motd');

+0

Il faut être super-utilisateur pour créer cette fonction. Mieux vaut utiliser une fonction côté client. – bortzmeyer

+0

Je n'ai rien vu dans la question originale qui me porte à croire qu'il ne l'est pas. – TML