Sto cercando di copiare un'intera tabella da un database all'altro in Postgres. Eventuali suggerimenti?
Sto cercando di copiare un'intera tabella da un database all'altro in Postgres. Eventuali suggerimenti?
Risposte:
Estrarre la tabella e reindirizzarla direttamente al database di destinazione:
pg_dump -t table_to_copy source_db | psql target_db
Nota: se nell'altro database è già impostata la tabella, è necessario utilizzare il -a
flag per importare solo i dati, altrimenti potrebbero essere visualizzati strani errori come "Memoria insufficiente":
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
flag solo per i dati . vale a dire pg_dump -a -t my_table my_db | psql target_db
. Mentre sono qui, se il tuo database si trova su un server, trovo più facile semplicemente scaricare il database in un file e quindi scp quel file al database, quindi inviare il contenuto del file a psql. ad es. pg_dump -a -t my_table my_db > my_file.sql
e dopo averlo messo sul tuo server ->psql my_other_db < my_file.sql
pg_dump -t '"tableToCopy"' source_db | psql target_db
. Nota che le virgolette singole e doppie racchiudono il nome della tabella
È inoltre possibile utilizzare la funzionalità di backup in pgAdmin II. Segui questi passaggi:
Funziona bene e può fare più tabelle alla volta.
Objects
sezione. Su OSX, fare clic sul pulsante SQL o ottenere SQL Editor
tramite il Tools
menu per incollare l'SQL copiato dal file di backup.
Usare dblink sarebbe più conveniente!
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);
Usando psql, su host linux che hanno connettività ad entrambi i server
( 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 ...
quindi non hai nemmeno bisogno di sottotitoli espliciti! Normalmente, ti consigliamo di fare un paio di cose da impostare prima, quindi le sottotitoli possono essere comunque necessarie. Inoltre, le password non verranno esportate nei processi successivi. Grazie!
pg_dump -t '<table_name>' --schema-only
Prima installa dblink
Quindi, faresti qualcosa del tipo:
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 significa locale, r è remoto. Sfuggire alle virgolette singole. Fornire i tipi col.)
Utilizzare pg_dump per scaricare i dati della tabella, quindi ripristinarli con psql.
Se hai entrambi i server remoti, puoi seguire questo:
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
Copia la tabella menzionata del database di origine nella stessa tabella del database di destinazione, se hai già uno schema esistente.
Puoi fare quanto segue:
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>
Per spostare una tabella dal database A al database B nella configurazione locale, utilizzare il comando seguente:
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>
prima di eseguire il comando
Ho provato alcune delle soluzioni qui e sono state davvero utili. Nella mia esperienza, la migliore soluzione è usare la riga di comando di psql , ma a volte non ho voglia di usare la riga di comando di psql. Quindi ecco un'altra soluzione per 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
)
)
Il problema con questo metodo è che devono essere scritti il nome dei campi e i loro tipi di tabella che si desidera copiare.
pg_dump
non funziona sempre.
Dato che hai la stessa tabella ddl in entrambi i dbs puoi hackerarla da stdout e stdin come segue:
# 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"
Come le risposte dell'utente5542464 e Piyush S. Wanare, ma suddivise in due passaggi:
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase > dump
cat dump | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
altrimenti la pipe chiede le due password contemporaneamente.
Devi usare DbLink per copiare i dati di una tabella in un'altra tabella in un database diverso. È necessario installare e configurare l'estensione DbLink per eseguire query tra database.
Ho già creato un post dettagliato su questo argomento. Si prega di visitare questo link
Controlla questo 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);
Se entrambi i DB (da & a) sono protetti da password, in quello scenario il terminale non chiederà la password per entrambi i DB, la richiesta della password apparirà solo una volta. Quindi, per risolvere questo problema, passare la password insieme ai comandi.
PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>
Stavo usando DataGrip (di Intellij Idea). ed è stato molto semplice copiare i dati da una tabella (in un database diverso a un altro).
Innanzitutto, assicurati di essere connesso con entrambe le origini dati in Data Grip.
Selezionare la tabella di origine e premere F5 o (Fare clic con il pulsante destro del mouse -> Seleziona copia tabella in.)
Questo ti mostrerà un elenco di tutte le tabelle (puoi anche cercare usando il nome di una tabella nella finestra popup). Seleziona il tuo obiettivo e premi OK.
DataGrip gestirà tutto il resto per te.
Se esegui pgAdmin (Backup:, pg_dump
Restore :) pg_restore
da Windows, proverà a inviare il file per impostazione predefinita a c:\Windows\System32
ed è per questo che otterrai l'errore di autorizzazione / accesso negato e non perché l'utente postgres non è abbastanza elevato. Esegui pgAdmin come amministratore o scegli semplicemente un percorso per l'output diverso dalle cartelle di sistema di Windows.
In alternativa, è anche possibile esporre le tabelle remote come tabelle locali utilizzando l'estensione del wrapper di dati esterno. È quindi possibile inserire nelle tabelle selezionando dalle tabelle nel database remoto. L'unico aspetto negativo è che non è molto veloce.