Скопировать таблицу из одной базы данных в другую в Postgres - PullRequest
223 голосов
/ 07 июля 2010

Я пытаюсь скопировать всю таблицу из одной базы данных в другую в Postgres. Есть предложения?

Ответы [ 18 ]

4 голосов
/ 28 июля 2017

pg_dump работает не всегда.

Учитывая, что у вас есть одна и та же таблица ddl в обеих БД, вы можете взломать ее из stdout и stdin следующим образом:

 # 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 голосов
/ 12 ноября 2015

Я попробовал некоторые решения здесь, и они были действительно полезны. По моему опыту, лучшим решением является использование psql командной строки, но иногда я не чувствую необходимости использовать командную строку psql. Итак, вот еще одно решение для 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 
  )
 )

Проблема с этим методом заключается в том, что должны быть написаны имена полей и их типы таблиц, которые вы хотите скопировать.

3 голосов
/ 08 сентября 2016

То же, что и ответы user5542464 и Piyush S. Wanare , но разделены на два этапа:

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

, в противном случае канал запрашивает два пароля в одном и том жевремя.

2 голосов
/ 27 февраля 2019

Проверьте это скрипт 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);
2 голосов
/ 22 августа 2015

Вы должны использовать DbLink для копирования данных одной таблицы в другую таблицу в другой базе данных. Вы должны установить и настроить расширение DbLink для выполнения кросс-запроса к базе данных.

Я уже создал подробный пост на эту тему. Пожалуйста, перейдите по этой ссылке

1 голос
/ 18 апреля 2019

Если обе БД (от и до) защищены паролем, в этом сценарии терминал не будет запрашивать пароль для обеих БД, запрос пароля появится только один раз.Итак, чтобы это исправить, передайте пароль вместе с командами.

PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>
0 голосов
/ 10 июня 2019

В качестве альтернативы вы также можете представить свои удаленные таблицы в качестве локальных таблиц, используя расширение для внешних данных.Затем вы можете вставить в свои таблицы, выбрав из таблиц в удаленной базе данных.Единственным недостатком является то, что это не очень быстро.

0 голосов
/ 08 сентября 2018

Если вы запустите pgAdmin (Backup: pg_dump, Restore: pg_restore) из Windows, он попытается вывести файл по умолчанию на c:\Windows\System32, поэтому вы получите сообщение об ошибке «Отказ в доступе / доступе», а не потому, что Пользователь postgres недостаточно повышен. Запустите pgAdmin от имени администратора или просто выберите место для вывода, отличное от системных папок Windows.

...