Analogue's Blog

home

Copier des données d'une base vers une autre sous PostgreSQL

30 Jul 2009

Copier des données d'une base vers une autre sous PostgreSQL

Il m'arrive d'avoir à copier des données d'une base PostgreSQL vers une autre, mais pas une table entière, juste un échantillon. La commande pg_dump m'est alors inutile car sa granularité est la table entière.

Je parle ici de transférer des données de tables identiques.

Soit la table définie par la commande SQL suivante présente dans les 2 bases de données bdd_source et bdd_destination:
CREATE TABLE machin (truc VARCHAR(255), bidule INT, quand DATE);
Supposons que l'on souhaite copier les machins dont le nombre de bidules est supérieur à 5 de la base bdd_source dans la base bdd_destination. Pas possible avec pg_dump simplement, mais relativement propre avec la commande COPY.

On peut sélectionner les données voulues à l'aide de la requête:
SELECT * FROM machin WHERE bidule > 5;
Pour copier notre sélection de données d'une base vers une autre, on peut utiliser la commande suivante:
psql bdd_source -c "COPY (SELECT * FROM machin WHERE bidule > 5) TO STDOUT" > machin_data
Les données sélectionnées se trouvent alors dans le fichier machin_data. Pour les insérer dans la base bdd_destination, il faut exécuter:
cat machin_data | psql bdd_destination -c "COPY machin FROM STDIN"
L'utilisation de l'entrée STDIN et de la sortie STDOUT permet de ne pas avoir besoin d'utiliser le compte super-utilisateur de vos serveurs PostgreSQL, qui est nécessaire pour écrire sur le système de fichier de votre serveur.

De cette façon, vous passez par un fichier local.

On pourrait aussi faire le transfert en une seule commande:
psql bdd_source -c "COPY (SELECT * FROM machin WHERE bidule > 5) TO STDOUT" | psql bdd_destination -c "COPY machin FROM STDIN"
Mais je préfère toujours vérifier ce que je fais, une erreur est vite arrivée... ;)

Comments