J'essaie de copier une table entière d'une base de données à une autre dans Postgres. Aucune suggestion?
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
Vous pouvez également utiliser la fonctionnalité de sauvegarde dans pgAdmin II. Il suffit de suivre ces étapes:
Fonctionne bien et peut faire plusieurs tables à la fois.
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);
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" )
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
);
Utilisez pg_dump pour vider les données de la table, puis restaurez-les avec psql.
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.
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
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>
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
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"
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.
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.
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
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>
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);
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.
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.