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

#1 02/07/2009 10:19:43

rbidocho
Membre

Transfert de tables de base à base ou dump en série

Bonjour,

voici la (les) question(s) du jour :

Je cherche à transférer des tables (une vingtaine) d'une base vers une autre. Sur ces 20 tables, une quinzaine existe déjà dans la base de destination, mais je veux remplacer les données --> existe t il une commande "simple" qui permet de supprimer les données de la table de destination puis de la reremplir avec les données de la table source (j'ai dblink d'installer) ?

pour les tables restantes (ou pour toutes les tables) , elles n'existe pas dans la base de destination et j'aimerai bien utiliser une commande qui ferait automatiquement les dump de chaque table pour les restaurer dans la base de destination.

pour info :

postgres 8.3.6 sur windows server 2003 rc2 avec pgadminIII 1.8.4

Je ne suis pas très à l'aise avec du pgsql alors si on pouvait le faire avec pgadmin

d'avance merci

RB

Hors ligne

#2 02/07/2009 11:08:39

gleu
Administrateur

Re : Transfert de tables de base à base ou dump en série

TRUNCATE pour supprimer les anciens enregistrements très rapidement. Par contre, pour remplir la table d'une base à partir de la table d'une autre base, non, il n'y a pas de commande pour ça à ma connaissance.

Le mieux est de passer par un pgdump --data-only | psql.


Guillaume.

Hors ligne

#3 02/07/2009 11:14:44

Haseo
Membre

Re : Transfert de tables de base à base ou dump en série

Bonjour,

déjà tu demandes de faire du dump de masse via pg_admin hmm .... ca va être laborieux.
Pour faire le dump de tes tables je vais t'indiquer la ligne de commande à exécuter dans un shell windows car les options passées en paramètres par défaut dans pg-admin son trop limitées et les modifier n'est pas pratique.

Il faut que tu te déplaces dans le dossier où se trouve pg_admin (c'est pour avoir la commande pg_dump.exe si cette commande est dans le classpath de ton serveur alors pas besoin de se déplacer).
Ensuite,exécutes la commande suivante :

pg_dump -i -c -h [adresse de l'hote] -U [utilisateur] -F p -t [nom table1] -t [nom table2] etc. -d -f [chemin et nom du fichier de sauvegarde] [nom de la base]

Petite explication des options employées :
-i : exécute le dump même si les versions de pg_dump et de la base sont différentes.
-c : (clean) supprime la table si elle existe, sinon une erreur est envoyée.
-F p : force le format a employer, p pour plain text (il me semble que c'est le format par défaut mais j'en suis pas sur).
-t : pour dumper une table spécifique avec les données.
-d : va mettre les données de ta table sous forme d'insert dans ton fichier, si cette option n'est pas mise, les données seront restaurées en utilisant COPY.
-f : signifie fichier.

TRUNCATE sert effectivement à vider les tables.

Maintenant que tu as tes fichiers, il te suffit de les ouvrir sous pd admin et de les excécuter.

Attention, si tu drop une table qui n'existe pas sous pg_admin ca annulera la transaction entière, alors qu'en utilisant psql sur le serveur ca ignore juste la commande qui ne fonctionne pas.

Dernière modification par Haseo (02/07/2009 11:27:54)

Hors ligne

#4 02/07/2009 11:23:56

daamien
damien clochard

Re : Transfert de tables de base à base ou dump en série

avec DBlink ça devrait pouvoir se faire comme ça. A vérifier

DROP TABLE table_destination; 
CREATE TABLE table_destination 
AS SELECT * 
     FROM dblink('dbname=base_source', 'select * from table_source')  AS lien_source (...);

Sinon le faire en ligne de commande me paraitplus élégant :

pg_dump --clean -t table_source base_source| psql base_destination

Hors ligne

#5 02/07/2009 12:33:33

rbidocho
Membre

Re : Transfert de tables de base à base ou dump en série

Woua woua woua !!!

Entre temps j'avais commencé à réfléchir à quelque chose du genre (il faut en plus que je créé les contraintes et les index dans les tables de destination sachant qu'elles n'existent pas dans les tables sources) à faire pour toutes les tables

---------
-- xxx --
---------
DELETE FROM xxx;

INSERT INTO xxx(aaa, bbb, ccc, ddd, eee, fff, ggg, hhh, iii, jjj, kkk)
    SELECT t1.aaa, t1.bbb, t1.ccc, t1.ddd, t1.eee, t1.fff, t1.ggg, t1.hhh, t1.iii, t1.jjj, t1.kkk
           FROM dblink('dbname=dbsource user=postgres password=pwd'::text, 
           'SELECT aaa, bbb, ccc, ddd, eee, fff, ggg, hhh, iii, jjj, kkk
	  FROM xxx'::text) t1(aaa serial, bbb bytea, ccc double precision, ddd character(30), eee character(50), fff double precision, ggg double precision, hhh integer, iii double precision, jjj double precision, kkk double precision);

ALTER TABLE xxx ALTER COLUMN aaa SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN bbb SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN ccc SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN ddd SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN eee SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN fff SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN ggg SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN hhh SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN iii SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN jjj SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN kkk SET NOT NULL;

ALTER TABLE xxx ADD CONSTRAINT xxx_pkey PRIMARY KEY(aaa);
ALTER TABLE xxx ADD CONSTRAINT xxx_fff_fkey FOREIGN KEY (fff) REFERENCES yyy (fff) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION;
ALTER TABLE xxx ADD CONSTRAINT xxx_ccc_fkey FOREIGN KEY (ccc) REFERENCES zzz (ccc) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION;

CREATE UNIQUE INDEX idx_xxx ON xxx USING btree (aaa);

En attente de vos commentaires

Merci

RB

Dernière modification par rbidocho (02/07/2009 12:44:18)

Hors ligne

#6 08/07/2009 11:24:21

rbidocho
Membre

Re : Transfert de tables de base à base ou dump en série

Bonjour,

bon ben j'y suis arrivé en faisant comme je l'ai dit dans mon dernier message. Le plus long a été de créer les requêtes avec le dblink (caractérisation de chaque champ).

Merci encore de vos lumières

RB

Hors ligne

Pied de page des forums