当前位置:  开发笔记 > 编程语言 > 正文

可以用postgres执行跨数据库查询吗?

如何解决《可以用postgres执行跨数据库查询吗?》经验,为你挑选了5个好方法。

我将猜测答案是否基于以下错误消息(以及此Google结果),但无论如何使用Postgres执行跨数据库查询?

databaseA=# select * from databaseB.public.someTableName;
ERROR:  cross-database references are not implemented:
 "databaseB.public.someTableName"

我正在处理一些跨两个数据库分区的数据,尽管两者之间真的共享数据(一个数据库中的userid列来自另一个数据库中的users表).我不知道为什么这些是两个独立的数据库而不是架构,但是c'est la vie ...



1> Neall..:

注意:正如原始提问者暗示的那样,如果您在同一台计算机上设置两个数据库,则可能需要制作两个模式 - 在这种情况下,您不需要任何特殊的查询.

自9.3起更新

您现在可以使用新的postgres_fdw(外部数据包装器)连接到任何Postgres数据库中的表 - 本地或远程.

请注意,其他常用数据源有外部数据包装器.在这个时候,只有postgres_fdwfile_fdw是正式的Postgres发布的一部分.

9.3之前的原始答案

此功能不是默认PostgreSQL安装的一部分,但您可以将其添加.它被调用dblink.

我从来没有使用它,但它与PostgreSQL的其余部分一起维护和分发.如果您使用的是Linux发行版附带的PostgreSQL版本,则可能需要安装名为postgresql-contrib的软件包.


从我可以阅读的内容来看,dblink不会处理您希望跨越两个数据库的查询的情况.

2> stimms..:

在你得到关于跨数据库查询的相同结论之前,我遇到了这个问题.我最终做的是使用模式来划分表空间,这样我可以保持表分组,但仍然查询它们.


如果您来自MySQL环境,那么MySQL调用数据库的确是模式(在MySQL中创建模式==创建数据库),因此如果您使用多个数据库从MySQL移植某些东西,请使用模式

3> Manwal..:
dblink() - 在远程数据库中执行查询

dblink在远程数据库中执行查询(通常是SELECT,但它可以是返回行的任何SQL语句).

当给出两个文本参数时,第一个参数首先被查找为持久连接的名称; 如果找到,则在该连接上执行该命令.如果未找到,则将第一个参数视为与dblink_connect相关的连接信息字符串,并且仅在此命令的持续时间内进行指示的连接.

一个很好的例子:

SELECT * 
FROM   table1 tb1 
LEFT   JOIN (
   SELECT *
   FROM   dblink('dbname=db2','SELECT id, code FROM table2')
   AS     tb2(id int, code text);
) AS tb2 ON tb2.column = tb1.column;

注意:我提供此信息以供将来参考.Refrence



4> Esteban Kübe..:

只是添加更多信息.

无法查询当前数据库以外的数据库.因为PostgreSQL加载特定于数据库的系统目录,所以不确定跨数据库查询应该如何表现.

contrib/dblink允许使用函数调用进行跨数据库查询.当然,客户端也可以同时连接到不同的数据库,并在客户端合并结果.

PostgreSQL FAQ


此附加信息可能会产生误导,并可能阻止用户使用上述解决方案.

5> 小智..:

是的,您可以使用DBlink(仅限postgresql)和DBI-Link(允许外部跨数据库查询器)和TDS_LInk,它允许对MS SQL服务器运行查询.

我之前使用过DB-Link和TDS-link取得了巨大的成功.

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有