【问题标题】:Is there any shortcut for using dblink in Postgres?在 Postgres 中使用 dblink 有什么捷径吗?
【发布时间】:2011-10-19 22:04:36
【问题描述】:

在 Postgres 中,您可以使用 dblink 链接到其他数据库,但语法非常冗长。例如你可以这样做:

SELECT *
FROM dblink (
    'dbname=name port=1234 host=host user=user password=password',
    'select * from table'
) AS users([insert each column name and its type here]);

有什么方法可以更快地做到这一点?也许预先定义连接?

我注意到 Postgres 有一个新的create foreign table 函数用于连接到 MySQL 数据库。它的语法比dblink 更简单。我可以用那个吗?

【问题讨论】:

    标签: postgresql syntax dblink cross-database


    【解决方案1】:

    在 PostgreSQL 8.4 及更高版本中,您可以使用外部数据包装器功能来定义连接参数。然后,您只需在 dblink 命令中引用外部服务器名称。请参阅documentation 中的示例。

    在 PostgreSQL 9.1 及更高版本中,您可以使用外部数据包装器功能来定义外部表,从而透明地访问远程数据库,而无需使用 dblink。为此,您需要获取 postgresql_fdw 包装器,它尚未包含在任何生产版本中,但您可以在 Internet 上找到实验代码。实际上,这条路线更像是未来的选择。

    【讨论】:

    • 现在称为 postgres_fdw 并包含在标准 PostgreSQL 中。
    【解决方案2】:

    您可以将 连接参数 包裹在 FOREIGN SERVER object 中,例如 @Peter explains,但您仍然需要拼出其余部分。

    您可以将所有内容封装在视图或函数中,因此您只需键入一次。函数示例 - 以超级用户身份运行:

    CREATE OR REPLACE FUNCTION f_lnk_tbl()
      RETURNS TABLE(tbl_id int, col1 text, log_ts timestamp) AS
    $BODY$
    
    SELECT *
      FROM dblink(
      'SELECT tbl_id, col1, log_ts
       FROM   tbl
       ORDER  BY tbl_id'::text) AS b(
     tbl_id int
    ,col1   text
    ,log_ts timestamp);
    
    $BODY$ LANGUAGE sql STABLE SECURITY DEFINER;
    REVOKE ALL ON FUNCTION f_lnk_tbl() FROM public;
    
    
    CREATE OR REPLACE FUNCTION f_sync()
      RETURNS text AS
    $BODY$
    
    SELECT dblink_connect('hostaddr=123.123.123.123 port=5432 dbname=mydb
                           user=postgres password=*secret*');
    
    INSERT INTO my_local_tbl SELECT * FROM f_lnk_tbl();
    -- more tables?
    
    SELECT dblink_disconnect();
    
    $BODY$
      LANGUAGE sql VOLATILE SECURITY DEFINER;
    REVOKE ALL ON FUNCTION blob.f_dbsync() FROM public;
    -- GRANT ....;
    

    【讨论】:

    • 嗯,这不是我想听到的,但我想这就是答案。谢谢,
    • 抱歉,这个人给了我我真正想要的答案,但这仍然是很好的信息。
    • @Joe:好吧,Peter 是一名 postgres 开发人员,他的信息应该不错! ;) 我也期待 FDW 的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多