Подтвердить что ты не робот

Передача данных между базами данных с помощью PostgreSQL

Мне нужно перенести некоторые данные из другой базы данных. Старая база данных называется 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

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

4b9b3361

Ответ 1

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

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


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

Затем предоставьте права доступа к скопированной таблице пользователю новой базы данных. Войдите в 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>;

Готово!

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

From: 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;

Ответ 5

Существует три варианта копирования, если это одно:

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

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

  • Изменить на схемы в той же БД
  • db_link

Ответ 6

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

INSERT INTO target.Awards SELECT * FROM source.Nominations;

Ответ 7

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

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

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

Ответ 8

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

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

  • Создайте язык plperlu в своей базе данных A

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

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

    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.