使用PostgreSQL在数据库之间传输数据

我需要从另一个数据库传输一些数据。 旧的数据库叫做paw1.movi​​esDB,新的数据库是paw1。 每个表的模式如下。

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

如何将旧数据库中的数据复制到新数据库中?

我只需要做这个确切的事情,所以我想我会在这里发布配方。 这假定两个数据库都在同一台服务器上。

首先,从旧的数据库复制表到新的数据库(因为显然你不能移动数据库之间的数据)。 在命令行:

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

接下来,将复制表的权限授予新数据库的用户。 login到psql:

 psql -U postgres -d <new_database> ALTER TABLE <old_table> OWNER TO <new_user>; \q 

最后,将数据从旧表复制到新表。 以新用户身份login,然后:

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

完成!

数据库被隔离在PostgreSQL中; 当连接到PostgreSQL服务器时,只连接到一个数据库,不能使用SQL查询将数据从一个数据库复制到另一个数据库。

如果你来自MySQL:MySQL调用(松散地)“ 数据库 ”是PostgreSQL中的“ 模式 ” – sorting的命名空间。 一个PostgreSQL数据库可以有许多模式,每个模式都有它的表和视图,你可以使用schema.table语法从一个模式复制到另一个模式。

如果你真的有两个不同的PostgreSQL数据库,将数据从一个数据传输到另一个数据库的常用方式是将你的数据表(使用pg_dump -t )导出到一个文件中,然后将数据导入另一个数据库(使用psql )。

如果你真的需要从一个独特的PostgreSQL数据库获取数据,Grant Johnson的答案中提到的另一个select是dblink ,它是一个额外的模块(在contrib/ )。

这对我来说是远程复制一个表从我的本地主机到Heroku的postgresql:

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

这会为您创build表格。

对于其他方向(从Heroku到本地) pg_dump -C -t source_table -h source_host -U source_user -p source_port source_db | psql -h localhost destination_db pg_dump -C -t source_table -h source_host -U source_user -p source_port source_db | psql -h localhost destination_db

如果这是一个closures,有三个选项可供复制:

  1. 使用db_link(我认为它仍然在contrib中)
  2. 让应用程序完成这项工作。
  3. 出口import

如果这是一个持续的需求,答案是:

  1. 更改到同一个数据库中的模式
  2. db_link

从:hxxp://dbaspot.c om / postgresql / 348627-pg_dump -t-give-where-condition.html( 注意:链接现在被打破

 # create tmp db with the data psql mydb CREATE TABLE temp1 (LIKE mytable); INSERT INTO temp1 SELECT * FROM mytable WHERE myconditions; \q # export the data pg_dump --data-only --column-inserts -t temp1 mtdb > out.sql psql mydb DROP TABLE temp1; \q # import temp1 somewhere cat out.sql | psql -d [other_db] psql other_db INSERT INTO mytable (SELECT * FROM temp1); DROP TABLE temp1; 

另一种有用的遥控方法

  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; 

就像leonbloy所build议的那样,在数据库中使用两个模式是最好的select。 假设一个模式(旧数据库)和一个目标模式(新数据库),你可以尝试这样的事情(你应该考虑列名,types等):

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

您不能执行像SQL Server这样的跨数据库查询; PostgreSQL不支持这个。

PostgreSQL的DbLink扩展用于将一个数据库连接到另一个数据库。 您已安装并configurationDbLink以执行跨数据库查询。

我已经创build了一个在PostgreSQL中执行跨数据库查询的分步脚本和示例。 请访问这篇文章: PostgreSQL [video]:使用DbLink扩展跨数据库查询

实际上,从一个PostgreSQL数据库发送表数据到另一个PostgreSQL数据库是有可能的。 我使用程序语言plperlu(不安全的Perl程序语言)。

说明(全部在Linux服务器上完成):

  1. 在数据库中创buildplperlu语言A

  2. 然后PostgreSQL可以通过在数据库A的postgresql.conf末尾的一系列以下命令来join一些Perl模块:

     plperl.on_init='use DBI;' plperl.on_init='use DBD::Pg;' 
  3. 你在A中构build一个函数就像这样:

     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'')' ); 

数据库B中的表“jm”中将添加“zzzzzz”的值。