Comment charger un fichier plat sous PostgreSQL ou mise en œuvre des foreign tables

Comment charger un fichier plat dans une base PostgreSQL sous Linux. On dispose d’une première solution avec la commande COPY. Une autre solution existe avec la mise en œuvre des foreign tables.
Cette Solution se rapproche de la solution foreign table d’Oracle et sa mise en application n’est guère plus compliquée.

pré requis .

Il faut au préalable s’assurer que le package contrib correspondant à la version de PostgreSQL est bien installé. Pour cela, sous le user root, utilisez la commande rpm -qa

rpm -qa | grep postgres
postgresql96-libs-9.6.1-1PGDG.rhel7.x86_64
postgresql96-server-9.6.1-1PGDG.rhel7.x86_64
postgresql96-contrib-9.6.1-1PGDG.rhel7.x86_64
postgresql96-devel-9.6.1-1PGDG.rhel7.x86_64
postgresql96-9.6.1-1PGDG.rhel7.x86_64
postgresql96-plperl-9.6.1-1PGDG.rhel7.x86_64

Le package contrib contient les pluggins mis a disposition pour enrichir la version de base de PostgreSQL.
Le user qui utilisera les foreign tables doit disposer du privilège superuser
Une fois cette vérification faite, on peut passer à la suite.

Installation du FDW de type file

Installation de l’extension

Pour permettre à PostgreSQL d’accéder à des données stockées hors de la base, on doit passer par un module, ou extension, de type foreign data wrapper. Il en existe de plusieurs sortes, mais l’extension qui nous intéresse actuellement est file_fdw. Elle est fournie nativement avec le package postgresqlXX-contrib. Il ne reste plus qu’à l’installer.
Pour cela, connectez-vous vous à votre base de données et lancez les commandes suivantes :

psql -d mabdd
CREATE EXTENSION file_fdw
    SCHEMA monschema;

Création du Foreign data wrapper

L’extension étant créée, on peut passer à la création du fdw. Pour cela, il y a plusieurs étapes :

  • Création du data wrapper
  • Association du data wrapper au schéma désiré
  • Création d’un serveur de données que l’on associe au data wrapper précédemment créé.

Pour cela, tapez les commandes suivantes :

psql -d mabdd
CREATE FOREIGN DATA WRAPPER file_fdw
    VALIDATOR monschema.file_fdw_validator
    HANDLER monschema.file_fdw_handler;
ALTER FOREIGN DATA WRAPPER file_fdw
    OWNER TO monuser;
CREATE SERVER srv_file_fdw
    FOREIGN DATA WRAPPER file_fdw;
ALTER SERVER srv_file_fdw
    OWNER TO monuser;

Voilà, notre environnement est prêt, il ne nous reste plus qu’à créer la foreign table pour mapper le fichier plat à charger.

Création de la foreign table

Partons de l’hypothèse que l’on veuille charger le fichier network.info de type CSV avec comme délimiteur de colonne le caractère « ; » et que ce fichier soit déposé dans le répertoire /home/postgres/fichiers_a_traiter.
La description du fichier est la suivante :

Nom du serveur
nom de l'interface
inet adresse
brodcast
masque
mtu
date d'extraction

La création de la foreign table se fait de la façon suivante :

psql -d mabdd -U monuser
CREATE FOREIGN TABLE monschema.f_network_info(
    full_hostname character varying (64),
    interface character varying (32),
    inet_adr character varying (32),
    brodcast character varying (32),
    mask character varying (32),
    mtu numeric (15),
    date_extraction date
)
    SERVER srv_file_fdw
options ( filename '/home/postgres/fichiers_a_traiter/network.info' ,
          delimiter ';'   ,
          format 'csv' );

La table est créée. Si l’on dispose du fichier adéquat dans /home/postgres/fichiers_a_traiter, on peut accéder aux données comme s’il s’agissait d’une table PostgreSQL.
Si cela vous parait plus compliqué que la mise en œuvre de la commande copy, cette méthode possède l’avantage de standardiser l’accès aux données hors base. C’est le même principe qui sera utilisé pour accéder aux données d’une base Oracle ou MS SQL, ce que l’on verra dans un prochain post.