5

在 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. 我可以用那个吗?

4

2 回答 2

7

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

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

于 2011-10-20T03:55:12.183 回答
4

您可以将连接参数包装在@Peter 解释的FOREIGN SERVER对象中,但您仍然必须拼出其余部分。

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

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 ....;
于 2011-10-19T23:24:32.047 回答