Я собираюсь предположить, что ответ не основан на приведенном ниже сообщении об ошибке (и этот результат Google), но есть все равно выполнить запрос кросс-базы данных с помощью Postgres?
databaseA=# select * from databaseB.public.someTableName;
ERROR: cross-database references are not implemented:
"databaseB.public.someTableName"
Я работаю с некоторыми данными, которые разбиты на две базы данных, хотя данные действительно разделены между ними (столбцы userid в одной базе данных поступают из таблицы users
в другой базе данных). Я понятия не имею, почему это две отдельные базы данных вместо схемы, но c'est la vie...
Примечание. Как предполагал первоначальный вопросник, если вы настраиваете две базы данных на одном компьютере, вы, вероятно, захотите сделать два schemas вместо этого - в этом случае вам не нужно ничего специального для запроса через них.
Теперь вы можете использовать новую postgres_fdw
(внешнюю обертку данных) для подключения к таблицам в любой базе данных Postgres - локальной или удаленной.
Обратите внимание, что существуют внешние обертки данных для других популярных источников данных. В это время только postgres_fdw
и file_fdw
являются частью официального распределения Postgres.
Эта функция не входит в стандартную установку PostgreSQL по умолчанию, но вы можете ее добавить. Она называется dblink
.
Я никогда не использовал его, но он поддерживается и распространяется вместе с остальной частью PostgreSQL. Если вы используете версию PostgreSQL, поставляемую с дистрибутивом Linux, вам может потребоваться установить пакет postgresql-contrib.
Я столкнулся с этим до того, как пришел к тому же выводу о кросс-запросах базы данных, как и вы. То, что я закончил, было использование схем для разделения табличного пространства таким образом, чтобы я мог хранить таблицы сгруппированными, но все еще запрашивать их все.
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
Просто добавьте немного больше информации.
Невозможно запросить базу данных, отличную от текущей. Поскольку PostgreSQL загружает системные каталоги, зависящие от базы данных, неизвестно, как должен вести себя запрос междоменной базы.
contrib/dblink позволяет выполнять запросы с использованием кросс-баз данных, используя вызовы функций. Конечно, клиент может также делать одновременные подключения к различным базам данных и объединять результаты на стороне клиента.
Да, вы можете использовать DBlink (только postgresql) и DBI-Link (разрешить внешние запросы перекрестных баз данных) и TDS_LInk, который позволяет запускать запросы на сервер MS SQL.
Я использовал DB-Link и TDS-ссылку раньше с большим успехом.
Если производительность важна, и большинство запросов доступны только для чтения, я бы предложил реплицировать данные в другую базу данных. Хотя это похоже на ненужное дублирование данных, оно может помочь, если требуются индексы.
Это можно сделать с помощью простых триггеров вставки, которые, в свою очередь, вызовут dblink для обновления другой копии. Существуют также полномасштабные варианты репликации (например, Slony), но это не по теме.
select
uuid_generate_v4() as "j"
,"x"."i"
, 1 as "t"
,'territory' as "s"
,"j"."key" as "k"
,"j"."value" as "v"
,true as "a"
from ( select "x".rowguid as "i", row_to_json(x) "j" from adventureworks.salesterritory "x" ) "x" CROSS JOIN LATERAL json_each(x."j") AS "j"
where "j"."key" not in ('rowguid', 'modifieddate', 'territoryid')
postgresql-contrib
передdblink
? Илиpostgresql-contrib
включаетdblink
? И тогда запрос OP будет работать, или вам нужно запросить его по-другому?