J'essaie de copier une table entière d'une base de données à une autre dans Postgres. Aucune suggestion?
J'essaie de copier une table entière d'une base de données à une autre dans Postgres. Aucune suggestion?
Réponses:
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
Remarque: Si l'autre base de données a déjà la table configurée, vous devez utiliser l' -a
indicateur pour importer uniquement des données, sinon vous pouvez voir des erreurs étranges comme "Mémoire insuffisante":
pg_dump -a -t my_table my_db | psql target_db
pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
-a
indicateur pour les données uniquement . ie pg_dump -a -t my_table my_db | psql target_db
. Pendant que je suis ici, si votre base de données est sur un serveur, je trouve plus facile de simplement vider la base de données dans un fichier, puis de scper ce fichier dans la base de données, puis d'envoyer le contenu du fichier à psql. par exemple pg_dump -a -t my_table my_db > my_file.sql
et après avoir mis cela sur votre serveur ->psql my_other_db < my_file.sql
pg_dump -t '"tableToCopy"' source_db | psql target_db
. Notez que les guillemets simples ET doubles entourent le nom de la table
Vous pouvez également utiliser la fonctionnalité de sauvegarde de pgAdmin II. Suivez simplement ces étapes:
Fonctionne bien et peut faire plusieurs tables à la fois.
Objects
section. Sous OSX, cliquez sur le bouton SQL ou obtenez le SQL Editor
via le Tools
menu pour coller le SQL copié à partir du fichier de sauvegarde.
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 disposant d'une connectivité aux deux serveurs
( export PGPASSWORD=password1
psql -U user1 -h host1 database1 \
-c "copy (select field1,field2 from table1) to stdout with csv" ) \
|
( export PGPASSWORD=password2
psql -U user2 -h host2 database2 \
-c "copy table2 (field1, field2) from stdin csv" )
PGPASSWORD=password1 psql -U ...
alors vous n'avez même pas besoin de sous-shell explicites! Normalement, vous voudrez faire quelques choses à configurer en premier, donc des sous-coquilles peuvent être nécessaires de toute façon. De plus, les mots de passe ne seront pas exportés dans les processus suivants. Merci!
pg_dump -t '<table_name>' --schema-only
Installez d' abord dblink
Ensuite, 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
);
INSERT INTO l_tbl (l_col1, l_col2, l_col3) SELECT * FROM dblink('dbname=r_db hostaddr=r_ip password=r_pass user=r_usr', 'select r_col1, r_col2, r_col3 from r_tbl where r_col1 between ''2015-10-29'' AND ''2015-10-30'' ') AS t1(col1 MACADDR, col2 TIMESTAMP, col3 NUMERIC(7,1));
(l signifie local, r est distant. Échapper les guillemets simples. Fournir les types de col.)
Utilisez pg_dump pour vider les données de la table, puis restaurez-les avec psql.
Si vous avez les deux serveurs distants, 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.
Vous pouvez effectuer les opérations suivantes:
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 dans votre configuration locale, utilisez la commande suivante:
pg_dump -h localhost -U owner-name -p 5432 -C -t table-name database1 | psql -U owner-name -h localhost -p 5432 database2
export PGPASSWORD=<passw>
avant d'exécuter la commande
J'ai essayé certaines des solutions ici et elles ont été vraiment utiles. D'après mon expérience, la meilleure solution consiste à utiliser la ligne de commande psql , mais parfois je n'ai pas envie d'utiliser la ligne de commande psql. Voici donc 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 table que vous souhaitez copier doivent être écrits.
pg_dump
ne fonctionne pas toujours.
Étant donné que vous avez la même table ddl dans les deux dbs, vous pouvez la pirater de 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"
Identique aux réponses de user5542464 et Piyush S. Wanare, mais divisé 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 pipe 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 dans une base de données différente. Vous devez installer et configurer l'extension DbLink pour exécuter une requête de base de données croisée.
J'ai déjà créé un article détaillé sur ce sujet. Veuillez visiter ce lien
Vérifiez ce 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);
Si les deux bases de données (de et vers) sont protégées par 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 seule fois. Donc, pour résoudre ce problème, transmettez 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>
J'utilisais DataGrip (By Intellij Idea). et il était très facile de copier des données d'une table (dans une base de données différente à une autre).
Tout d'abord, assurez-vous que vous êtes connecté aux deux DataSources dans Data Grip.
Sélectionnez le tableau source et appuyez sur F5 ou (Cliquez avec le bouton droit -> Sélectionnez Copier le tableau vers.)
Cela vous montrera une liste de toutes les tables (vous pouvez également rechercher en utilisant un nom de table dans la fenêtre contextuelle). Sélectionnez simplement votre cible et appuyez sur OK.
DataGrip s'occupera de tout le reste pour vous.
Si vous exécutez pgAdmin (Backup pg_dump
:, Restore:) à pg_restore
partir de Windows, il essaiera de sortir le fichier par défaut c:\Windows\System32
et c'est pourquoi vous obtiendrez une erreur d'autorisation / d'accès refusé 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.
Comme alternative, vous pouvez également exposer vos tables distantes en tant que tables locales à l'aide de l'extension de wrapper de données étrangères. Vous pouvez ensuite insérer dans vos tables en sélectionnant parmi les tables de la base de données distante. Le seul inconvénient, c'est que ce n'est pas très rapide.