我正在尝试使用FDW在本地的postgres数据库之间创建一个链接。这是我创建此链接的代码:
CREATE EXTENSION IF NOT EXISTS postgres_fdw;
CREATE SERVER IF NOT EXISTS TEST_SERVER FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '127.0.0.1', dbname 'TestDatabase', port '5432');
CREATE USER MAPPING IF NOT EXISTS FOR postgres SERVER TEST_SERVER OPTIONS (user 'postgres', password 'postgres');
CREATE FOREIGN TABLE IF NOT EXISTS TEST_PUBLIC.TEST_TABLE(
ID INT NOT NULL,
VALUE VARCHAR(11) NOT NULL
) SERVER TEST_SERVER;
测试表存在于TestDatabase上,test_public架构存在于我正在创建FDW的当前数据库中。当我最初创建它并测试它时,我可以看到没有问题的对象,但是我的开发过程的一部分(对于这个特定项目(是将所有对象放在当前并从头开始重新运行,因此当我们将其移动到新环境时,我们知道从头到尾一切都是可靠的。
我遇到的问题是我无法再看到外表"TEST_TABLE"。
当我运行这个时:
SELECT * FROM information_schema.tables WHERE table_schema = 'test_public'
我得到以下返回:
table_catalog table_schema table_name table_type
TestDatabase test_public test_table FOREIGN
但是当我从表test_public.test_table中进行选择时,我收到以下错误:
relation "test_public.test_table" does not exist
我能够在此过程中弄清楚我所有的困境,但即使在逐步运行而不是完全部署之后,我似乎也无法再访问外部表。关于我错过了什么的任何建议?
您需要使用 OPTIONS 子句将源表映射到外表 (查看详细信息(。
在您的情况下,它应该类似于(假设源表在架构中被命名为test
public
(:
create foreign table test_public.test_table(
id int not null,
value varchar(11) not null)
server test_server
options(schema_name 'public', table_name 'test');
下面是使用本地实例的代码的改编示例。
以下是源代码:
create database source_db;
c source_db
create table source_table(c int);
insert into source_table values(12);
--
c postgres
create schema target_schema;
create server target_server foreign data wrapper postgres_fdw
options (host '127.0.0.1', dbname 'source_db', port '5431');
create user mapping for postgres server target_server
options (user 'postgres', password 'postgres');
create foreign table target_schema.target_table(c int) server target_server
options(schema_name 'public', table_name 'source_table');
select * from target_schema.target_table;
这是执行:
create database source_db;
CREATE DATABASE
You are now connected to database "source_db" as user "postgres".
create table source_table(c int);
CREATE TABLE
insert into source_table values(12);
INSERT 0 1
You are now connected to database "postgres" as user "postgres".
create schema target_schema;
CREATE SCHEMA
create server target_server foreign data wrapper postgres_fdw
options (host '127.0.0.1', dbname 'source_db', port '5431');
CREATE SERVER
create user mapping for postgres server target_server
options (user 'postgres', password 'postgres');
CREATE USER MAPPING
create foreign table target_schema.target_table(c int) server target_server
options(schema_name 'public', table_name 'source_table');
CREATE FOREIGN TABLE
select * from target_schema.target_table;
c
----
12
(1 row)