Postgresql:从本地到远程数据库的存储函数中的 dblink
Posted
技术标签:
【中文标题】Postgresql:从本地到远程数据库的存储函数中的 dblink【英文标题】:Postgresql: dblink in Stored Functions from local to remote database 【发布时间】:2012-09-06 09:51:56 【问题描述】:我检查了我使用并运行良好的以下链接。但我想反对这件事。
Postgresql: dblink in Stored Functions
我的场景:有两个数据库。我想将一个表数据从本地复制到远程数据库。我使用了 dblink,但我很困惑如何使用 dblink 来存储数据?
本地数据库名称:localdatabase
远程数据库名称:remotedatabase
谁能建议我如何做到这一点?
提前致谢。
【问题讨论】:
基本上答案中描述的方法对您有用。您必须将 dblink() 替换为 dblink_exec(),这将用于不返回行的 SQL 语句(如您的情况下的INSERT
)。
感谢您的快速回复,但我想将本地数据库中的所有数据插入远程数据库。那时我在本地,想使用 dblink 传输所有数据。有可能吗?
请在下面查看我的答案。
【参考方案1】:
下面几行应该可以工作:
SELECT dblink_connect('hostaddr=127.0.0.1 port=5432 dbname=mydb user=postgres password=mypasswd');
-- change the connection string to your taste
SELECT dblink_exec('INSERT INTO test (some_text) VALUES (''Text go here'');');
其中test
是远程数据库中的一个表,其定义如下:
CREATE TABLE test(
id serial
, some_text text
);
运行dblink_exec()
后,您可以在远程数据库中检查结果(或在本地,使用dblink()
,如下例所示)。
SELECT * FROM dblink('SELECT id, some_text FROM test') AS d(id integer, some_text text);
id | some_text
----+--------------
1 | Text go here
(1 row)
您也可以将 dblink_exec
调用包装在一个函数中:
CREATE OR REPLACE FUNCTION f_dblink_test_update(val text, id integer) RETURNS text AS
$body$
SELECT dblink_exec('UPDATE torles.test SET some_text=' || quote_literal($1) || ' WHERE id = ' || $2);
$body$
LANGUAGE sql;
如您所见,您甚至可以动态构建查询字符串。 (并不是我提倡这种方法,因为您必须小心不要以这种方式将 SQL 注入漏洞引入您的系统。)
由于dblink_exec
会返回一条关于它所做操作的文本消息,因此您必须将您的函数定义为RETURNS text
,除非在dblink_exec
调用之后还有其他值返回语句。
【讨论】:
是否可以在 dblink 的帮助下使用过程更新查询?以上是关于Postgresql:从本地到远程数据库的存储函数中的 dblink的主要内容,如果未能解决你的问题,请参考以下文章
在不使用 S3 存储桶的情况下将数据从远程服务器的 .gz 文件加载到 redshift 的 postgresql 实例?
将 postgresql 本地复制到远程数据库(都带有密码) - 错误:无法识别选项“区域设置”