Передача данных между базами данных с PostgreSQL - PullRequest
47 голосов
/ 16 июня 2010

Мне нужно перенести некоторые данные из другой базы данных.Старая база данных называется paw1.moviesDB, а новая база данных - paw1.Схемы каждой таблицы следующие.

Awards (name of the table)(new DB)
Id [PK] Serial           Award

Nominations (name of the table) (old DB)
Id [PK] Serial           nominations

Как скопировать данные из старой базы данных в новую базу данных?

Ответы [ 8 ]

69 голосов
/ 29 марта 2012

Мне просто нужно было сделать именно эту вещь, поэтому я решил опубликовать рецепт здесь.Это предполагает, что обе базы данных находятся на одном и том же сервере.

Сначала скопируйте таблицу из старой базы данных в новую базу данных (поскольку, очевидно, вы не можете перемещать данные между базами данных).В командной строке:

pg_dump -U postgres -t <old_table> <old_database> | psql -U postgres -d <new_database>

# Just adding extra space here so scrollbar doesn't hide the command

Далее предоставьте разрешения для скопированной таблицы пользователю новой базы данных.Войдите в psql:

psql -U postgres -d <new_database>

ALTER TABLE <old_table> OWNER TO <new_user>;

\q

Наконец, скопируйте данные из старой таблицы в новую таблицу.Войдите в систему как новый пользователь и затем:

INSERT INTO <new_table> (field1, field2, field3) 
SELECT field1, field2, field3 from <old_table>;

Готово!

33 голосов
/ 16 июня 2010

Базы данных изолированы в PostgreSQL;когда вы подключаетесь к серверу PostgreSQL, вы подключаетесь только к одной базе данных, вы не можете копировать данные из одной базы данных в другую, используя SQL-запрос.

Если вы пришли из MySQL: то, что MySQL вызывает (свободно) " базы данных"являются" схемами "в PostgreSQL - сортировка пространств имен.База данных PostgreSQL может иметь много схем, каждая со своими таблицами и представлениями, и вы можете копировать из одной схемы в другую с синтаксисом schema.table.

Если у вас действительно есть две разные базы данных PostgreSQL, общий способПередача данных из одной в другую будет означать экспорт ваших таблиц (с pg_dump -t) в файл и импорт их в другую базу данных (с psql).

Есливам действительно нужно получить данные из отдельной базы данных PostgreSQL, другой вариант - упомянутый в ответе Гранта Джонсона - это dblink , который является дополнительным модулем (в contrib/).

19 голосов
/ 20 ноября 2013

Это сработало для меня, чтобы скопировать таблицу удаленно с моего локального хоста в postgresql Heroku:

pg_dump -C -t source_table -h localhost source_db | psql -h destination_host -U destination_user -p destination_port destination_db

Это создаст таблицу для вас.

Для другого направления (от Heroku до местного) pg_dump -C -t source_table -h source_host -U source_user -p source_port source_db | psql -h localhost destination_db

10 голосов
/ 06 августа 2012

От: hxxp: //dbaspot.c om / postgresql / 348627-pg_dump-t-give-where-condition.html ( ПРИМЕЧАНИЕ: ссылка теперь не работает )

# create temp table with the data
psql mydb
CREATE TABLE temp1 (LIKE mytable);
INSERT INTO temp1 SELECT * FROM mytable WHERE myconditions;
\q

# export the data to a sql file
pg_dump --data-only --column-inserts -t temp1 mtdb > out.sql
psql mydb
DROP TABLE temp1;
\q

# import temp1 rows in another database
cat out.sql | psql -d [other_db]
psql other_db
INSERT INTO mytable (SELECT * FROM temp1);
DROP TABLE temp1;

Еще один метод, полезный для пультов

  # export a table csv and import in another database
  psql-remote> COPY elements TO '/tmp/elements.csv' DELIMITER ',' CSV HEADER;
  $ scp host.com:/tmp/elements.csv /tmp/elements.csv
  psql-local> COPY elements FROM '/tmp/elements.csv' DELIMITER ',' CSV;
8 голосов
/ 17 июня 2010

Существует три варианта его копирования, если он выключен:

  1. Используйте ссылку db_link (я думаю, что она все еще в Contrib)
  2. Приложение должно работать.
  3. Экспорт / импорт

Если это постоянная необходимость, ответы:

  1. Изменить на схемы в той же БД
  2. db_link
0 голосов
/ 18 декабря 2015

На самом деле, существует некоторая возможность отправлять данные таблицы из одной базы данных PostgreSQL в другую.Я использую для этого процедурный язык plperlu (небезопасный процедурный язык Perl).

Описание (все было сделано на сервере Linux):

  1. Создать язык plperlu в вашей базе данныхA

  2. Затем PostgreSQL может присоединиться к некоторым модулям Perl с помощью ряда следующих команд в конце postgresql.conf для базы данных A:

    plperl.on_init='use DBI;'
    plperl.on_init='use DBD::Pg;'
    
  3. Вы строите функцию в A следующим образом:

    CREATE OR REPLACE FUNCTION send_data( VARCHAR )
    RETURNS character varying AS
    $BODY$
    my $command = $_[0] || die 'No SQL command!';
    my $connection_string =
    "dbi:Pg:dbname=your_dbase;host=192.168.1.2;port=5432;";
    $dbh = DBI->connect($connection_string,'user','pass',
    {AutoCommit=>0,RaiseError=>1,PrintError=>1,pg_enable_utf8=>1,}
    );
    my $sql = $dbh-> prepare( $command );
    eval { $sql-> execute() };
    my $error = $dbh-> state;
    $sql-> finish;
    if ( $error ) { $dbh-> rollback() } else {  $dbh-> commit() }
    $dbh-> disconnect();
    $BODY$
    LANGUAGE plperlu VOLATILE;
    

И затем вы можете вызвать функцию внутри базы данных A:

SELECT send_data( 'INSERT INTO jm (jm) VALUES (''zzzzzz'')' );

И значение«zzzzzz» будет добавлен в таблицу «jm» в базе данных B.

0 голосов
/ 22 августа 2015

Вы не можете выполнять кросс-запрос к базе данных, как SQL Server; PostgreSQL не поддерживает это.

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

Я уже создал пошаговый скрипт и пример для выполнения кросс-запроса к базе данных в PostgreSQL. Пожалуйста, посетите это post: PostgreSQL [видео]: кросс-запросы к базе данных с использованием расширения DbLink

0 голосов
/ 17 июня 2010

Точно так же, как предложил leonbloy, использование двух схем в базе данных - это путь.Предположим, что схема source (старая БД) и схема target (новая БД), вы можете попробовать что-то вроде этого (вы должны учитывать имена столбцов, типы и т. Д.):

INSERT INTO target.Awards SELECT * FROM source.Nominations;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...