我在同一个PostgreSQL服务器上有几个数据库,它们的表完全相同,列也完全相同。我想编写一个用户可以用来一次查询所有这些数据库的函数,就像这样:
SELECT * FROM all_databases();
此刻,我刚刚找到了如何查询另一个数据库:
-- 1. Get database names
SELECT datname
FROM pg_database
WHERE name LIKE '%someString%';
-- 2. Get data from different databases with postgres_fdw (same host or remote host)
-- 2.1. Install the module
CREATE EXTENSION postgres_fdw;
-- 2.2. Create a server connection
CREATE SERVER foreign_db
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'localhost', dbname 'foreignDbName', port '5432');
-- 2.3. Create user mapping for the foreign server
CREATE USER MAPPING FOR CURRENT_USER
SERVER foreign_db
OPTIONS (user 'postgres', password 'password');
-- 2.4. Import the foreign schema
IMPORT FOREIGN SCHEMA public
FROM SERVER foreign_db INTO public;
所以,我要做的是对1所返回的每个结果执行类似于2中编写的内容。看来我将不得不使用一些动态SQL,但是我有点迷失了…… / p>
答案 0 :(得分:0)
首先,如果两个数据库中的表具有相同的名称,则不能将其导入相同的模式,而必须将其导入另一个模式或使用另一个外部表名称手动导入。(请参见CREATE FOREIGN TABLE )
第二,您可以对外部表进行简单的SELECT查询。例如
CREATE SCHEMA ft_db2; -- foreign tables db2 schema
IMPORT FOREIGN SCHEMA public
FROM SERVER foreign_db INTO ft_db2;
CREATE OR REPLACE FUNCTION all_databases()
RETURNS SETOF public.test AS
$$
SELECT * FROM public.test
UNION ALL
SELECT * FROM ft_db2.test;
$$
LANGUAGE sql;
SELECT * FROM all_databases();