PostgreSQL: функция для запроса по нескольким базам данных - PullRequest
0 голосов
/ 05 июля 2019

У меня есть несколько баз данных на одном сервере 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; 

Итак, я хочу выполнить что-то наподобие того, что написано в 2 для каждого результата, возвращаемого 1. Похоже, мне придется использовать какой-то динамический SQL, но я немного растерялся ...

1 Ответ

0 голосов
/ 05 июля 2019

Во-первых, если таблицы в обеих БД имеют одинаковые имена, вы не можете импортировать их в одной и той же схеме, вы должны импортировать их в другой схеме или вручную с другим именем внешней таблицы (см. CREATE FOREIGNTABLE )

Во-вторых, вы можете выполнить свой запрос с помощью простого 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...