Передача данных между базами данных с помощью 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
Как скопировать данные из старой базы данных в новую базу данных?
Ответы
Ответ 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.