如何使用PostgreSQL Foreign Data Wrapper加入2个不同的postgresql数据库

时间:2011-07-16 20:48:27

标签: postgresql

任何人都可以提供一个示例(涉及各种SQL语句)如何在postgresql中使用外部数据包装器来启用postgresql数据库A中的表从postgresql数据库B连接到表吗?

从文档中不清楚pgsql 9.0与9.1中可用的FDW功能的程度。文档也没有任何示例显示如何使用FDW在2个不同的postgresql数据库(使用WHERE限定符下推)之间进行连接。

http://www.postgresql.org/docs/9.0/static/sql-createforeigndatawrapper.html

http://www.postgresql.org/docs/9.1/static/ddl-foreign-data.html

http://www.depesz.com/index.php/2011/03/14/waiting-for-9-1-foreign-data-wrapper/

3 个答案:

答案 0 :(得分:6)

你就像任何一张桌子一样操纵它。 Per Depesz的帖子:

CREATE FOREIGN TABLE passwd (
    username text,
    pass text,
    uid int4,
    gid int4,
    gecos text,
    home text,
    shell text
) SERVER file_server
OPTIONS (format 'text', filename '/etc/passwd', delimiter ':', null '');

select * from passwd;

文档没有连接表的例子,原因很简单:它是普通的旧SQL ...

加入下推当前是GSOC的主题:

答案 1 :(得分:3)

我找到的最简单的解决方案是 dblink 扩展。我在PostgreSQL 9.1上测试过它:

create extension dblink.
select * from dblink('port=5452 host=localhost dbname=mydb user=myuser password=xxx', 
                     'select id,spaltenname from variablen') as v (a int, b varchar(20));

http://www.postgresql.org/docs/9.1/static/dblink.html

简单的连接将是:

with a as (select * from dblink('port=5452 host=localhost dbname=mydb user=myuser password=xxx', 'select id,spaltenname from variablen') as v (a int, b varchar(20)))
select a join (select 1)b on (true);

上面的示例使您可以与另一个postgresql服务器上的表连接,但它只是一个副本然后加入。没有自动“WHERE qualifier push-down”就像你所说的那样。你当然可以在第一个语句中选择你需要它们的行......

答案 2 :(得分:1)

如果你想加入2个不同的postgresql数据库,我建议你使用dblink:

select datos.* 
     FROM dblink('hostaddr=192.168.0.10 port=5432 dbname=my_dbname user=my_user password=my_pass'::text, ' 
               select field_1, field_2 
               from my_table  order by field_1
               '
               ::text) 
      datos(field_1, integer, field_2 character varying(10));

(我在PostgreSQL 9.1.3上测试过它) http://www.postgresql.org/docs/9.2/static/contrib-dblink-function.html