Using Foreign Data Wrappers
1. Understanding Foreign Data Wrappers
| Concept | Detail |
|---|---|
| FDW | SQL gateway to external data |
| Server | Connection definition |
| User Mapping | Local role → remote credentials |
| Foreign Table | Local schema object that reads remote |
2. Installing postgres_fdw Extension
CREATE EXTENSION postgres_fdw;
3. Creating Foreign Server
CREATE SERVER analytics_srv
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'analytics.db.example.com', port '5432', dbname 'warehouse');
4. Creating User Mapping
CREATE USER MAPPING FOR app_writer SERVER analytics_srv
OPTIONS (user 'reporter', password 'secret');
5. Creating Foreign Table
CREATE FOREIGN TABLE fact_orders (
id bigint, customer_id bigint, total_cents bigint, placed_at timestamptz
) SERVER analytics_srv OPTIONS (schema_name 'public', table_name 'orders');
6. Importing Foreign Schema
IMPORT FOREIGN SCHEMA public
LIMIT TO (orders, customers)
FROM SERVER analytics_srv INTO ext;
7. Querying Foreign Tables
EXPLAIN SELECT count(*) FROM fact_orders WHERE placed_at > now() - interval '7 days';
-- Foreign Scan pushes WHERE down to remote when use_remote_estimate=on
8. Using file_fdw
CREATE EXTENSION file_fdw;
CREATE SERVER files FOREIGN DATA WRAPPER file_fdw;
CREATE FOREIGN TABLE access_log (ts text, ip text, path text)
SERVER files OPTIONS (filename '/var/log/access.tsv', format 'text', delimiter E'\t');
9. Using dblink Extension
CREATE EXTENSION dblink;
SELECT *
FROM dblink('host=remote dbname=app user=u password=p',
'SELECT id, name FROM customers')
AS t(id int, name text);
10. Listing Foreign Servers
\des+
SELECT srvname, srvoptions FROM pg_foreign_server;
11. Listing User Mappings
\deu+
SELECT * FROM pg_user_mappings;
12. Listing Foreign Tables
\det+
SELECT foreign_table_schema, foreign_table_name FROM information_schema.foreign_tables;
13. Dropping Foreign Table
DROP FOREIGN TABLE fact_orders;
14. Dropping Foreign Server
DROP USER MAPPING FOR app_writer SERVER analytics_srv;
DROP SERVER analytics_srv CASCADE;