web-dev-qa-db-fra.com

Copier une table d'une base de données à une autre dans Postgres

J'essaie de copier une table entière d'une base de données à une autre dans Postgres. Aucune suggestion?

202
nix

Extrayez la table et dirigez-la directement vers la base de données cible:

pg_dump -t table_to_copy source_db | psql target_db
219
thomax

Vous pouvez également utiliser la fonctionnalité de sauvegarde dans pgAdmin II. Il suffit de suivre ces étapes:

  • Dans pgAdmin, cliquez avec le bouton droit sur la table que vous souhaitez déplacer, sélectionnez "Sauvegarde".
  • Choisissez le répertoire du fichier de sortie et définissez Format sur "plain"
  • Cliquez sur l'onglet "Options de vidage # 1", cochez l'option "Seulement les données" ou "uniquement le schéma"
  • Sous la section Requêtes, cliquez sur "Use Column Inserts" et "User Insert Commands".
  • Cliquez sur le bouton "Sauvegarder". Cette sortie dans un fichier .backup
  • Ouvrez ce nouveau fichier en utilisant le bloc-notes. Vous verrez les scripts d'insertion nécessaires pour la table/les données. Copiez-les et collez-les dans la nouvelle page SQL de la base de données dans pgAdmin. Exécuter en tant que pgScript - Requête-> Exécuter en tant que pgScript F6

Fonctionne bien et peut faire plusieurs tables à la fois. 

78
a2ron44

Utiliser dblink serait plus pratique!

truncate table tableA;

insert into tableA
select *
from dblink('dbname=postgres hostaddr=xxx.xxx.xxx.xxx dbname=mydb user=postgres',
            'select a,b from tableA')
       as t1(a text,b text);
63
tinychen

Utilisation de psql sur un hôte Linux ayant une connectivité aux deux serveurs

( PGPASSWORD=password1 
  psql -U user1 -h Host1 database1 \
  -c "copy (select field1,field2 from table1) to stdout with csv" ) \
| 
( PGPASSWORD=password2 
  psql -U user2 -h Host2 database2 \ 
   -c "copy table2 (field1, field2) from stdin csv" )
22
Alexey Sviridov

premier installer dblink

vous feriez quelque chose comme:

 INSERT INTO t2 select * from 
dblink('Host=1.2.3.4
 user=*****
 password=******
 dbname=D1', 'select * t1') tt(
       id int,
  col_1 character varying,
  col_2 character varying,
  col_3 int,
  col_4 varchar 
 );
17
user3946530

Utilisez pg_dump pour vider les données de la table, puis restaurez-les avec psql.

13
Pablo Santa Cruz

Si vous avez les deux serveurs distants, alors vous pouvez suivre ceci:

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

Il copiera la table mentionnée de la base de données source dans la même table nommée de la base de données cible, si vous avez déjà un schéma existant. 

9
Piyush S. Wanare

Voici ce qui a fonctionné pour moi . Premier dump dans un fichier:

pg_dump -h localhost -U myuser -C -t my_table -d first_db>/tmp/table_dump

puis chargez le fichier vidé:

psql -U myuser -d second_db</tmp/table_dump
7
max
pg_dump -h <Host ip address> -U <Host db user name> -t <Host table> > <Host database> | psql -h localhost -d <local database> -U <local db > user>

7
Gowtham Balusamy

Pour déplacer une table de la base de données A vers la base de données B de votre configuration locale, utilisez la commande suivante:

pg_dump -h localhost -U nom-propriétaire -p 5432 -C -t nom-table base1 | psql -U nom-propriétaire -h localhost -p 5432 database2

5
user5542464

pg_dump ne fonctionne pas toujours ... 

Etant donné que vous avez la même table ddl dans les deux dbs, vous pouvez la modifier depuis stdout et stdin comme suit:

 # grab the list of cols straight from bash

 psql -d "$src_db" -t -c \
 "SELECT column_name 
 FROM information_schema.columns 
 WHERE 1=1 
 AND table_name='"$table_to_copy"'"
 # ^^^ filter autogenerated cols if needed     

 psql -d "$src_db" -c  \
 "copy ( SELECT col_1 , col2 FROM table_to_copy) TO STDOUT" |\
 psql -d "$tgt_db" -c "\copy table_to_copy (col_1 , col2) FROM STDIN"
4
Yordan Georgiev

J'ai essayé certaines des solutions ici et elles ont été vraiment utiles. D'après mon expérience, la meilleure solution consiste à utiliser psql ligne de commande, mais parfois, je n'ai pas envie d'utiliser la ligne de commande psql. Donc, voici une autre solution pour pgAdminIII

create table table1 as(
 select t1.* 
 from dblink(
   'dbname=dbSource user=user1 password=passwordUser1',
   'select * from table1'  
  ) as t1(
    fieldName1 as bigserial,
    fieldName2 as text,
    fieldName3 as double precision 
  )
 )

Le problème avec cette méthode est que le nom des champs et leurs types de la table que vous souhaitez copier doivent être écrits.

3
Eloy A

Voir les réponses données par user5542464 et Piyush S. Wanare mais en deux étapes:

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase > dump
cat dump | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

sinon, le canal demande les deux mots de passe en même temps.

3
Adobe

Vous devez utiliser DbLink pour copier les données d’une table dans une autre table d’une autre base de données. Vous devez installer et configurer l’extension DbLink pour exécuter une requête croisée avec une base de données. 

J'ai déjà créé un article détaillé sur ce sujet. S'il vous plaît visitez ce lien

2
Anvesh

Si les deux bases de données (de et à) sont protégées par un mot de passe, dans ce scénario, le terminal ne demandera pas le mot de passe pour les deux bases de données, l'invite de mot de passe n'apparaîtra qu'une fois. Donc, pour résoudre ce problème, passez le mot de passe avec les commandes.

PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>
1
Dante

Cochez cette script python

python db_copy_table.py "Host=192.168.1.1 port=5432 user=admin password=admin dbname=mydb" "Host=localhost port=5432 user=admin password=admin dbname=mydb" alarmrules -w "WHERE id=19" -v
Source number of rows = 2
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister1',true,false);
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister2',true,false);
1
themadmax

En guise d'alternative, vous pouvez également exposer vos tables distantes en tant que tables locales à l'aide de l'extension de wrapper de données distantes. Vous pouvez ensuite insérer dans vos tables en les sélectionnant dans la base de données distante. Le seul inconvénient est que ce n'est pas très rapide.

0
ThatDataGuy

Si vous exécutez pgAdmin (Sauvegarde: pg_dump, Restauration: pg_restore) à partir de Windows, il essaiera de générer le fichier par défaut à c:\Windows\System32. C'est pourquoi vous obtiendrez une erreur Permission/Access denied et non pas parce que l'utilisateur postgres n'est pas assez élevé. Exécutez pgAdmin en tant qu'administrateur ou choisissez simplement un emplacement pour la sortie autre que les dossiers système de Windows.

0
Imre