目錄
介紹
我已經與Postgres一起工作了10多年,我必須說我對它的性能、可靠性和使開發人員的生活更輕鬆的特性非常滿意。
我喜歡的這些功能之一是對Foreign table的支持,這是一個非常有用的功能,幾年前我在網上發現它的。
背景
Postgres官方文檔描述瞭如何創建外部表,但是沒有顯示如何逐步進行工作,因此我決定在此處撰寫此文章。
環境配置
對於此示例,我們需要兩個Postgres服務器。我將使用Docker在我的PC中創建它們,以便在完成本文後可以輕鬆擺脫它們。
由於我假設您已經擁有服務器,因此此步驟是完全可選的,但是如果您好奇並從未使用過該服務器,請隨時訪問此處和此處。
您應該能夠使用終端和這兩個命令來創建服務器,分別如下。
docker run --name postgres_1 -e POSTGRES_PASSWORD=postgres_1_pw -d postgres
docker run --name postgres_2 -e POSTGRES_PASSWORD=postgres_2_pw -d postgres
您知道如果運行docker ps一切都會順利,並且會看到類似以下內容的信息:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65b706348544 postgres "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 5432/tcp postgres_2
16b1dcfd09fb postgres "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 5432/tcp postgres_1
數據庫設置
在開始使用外部表之前,在以下所示的兩臺服務器中都需要一個非常基本的結構:
完成此操作後,我們將需要一個示例表users,其中包含位於postgres_2中的database_2上的一些隨機數據。
要從服務器1(postgres_1)讀取和寫入users表,我們需要使用postgres_fdw擴展名,該擴展名將允許我們訪問遠程表中的數據,創建數據的原始源,當然,我們將需要一些憑據才能訪問數據在遠程服務器上。
一旦從postgres_2導入了users表到postgres_1,該users表應該可以以讀或寫操作進行訪問。
全部放在一起
遠程服務器腳本(postgres_2)
CREATE TABLE users
(
id serial primary key,
name character varying NOT NULL,
email character varying NOT NULL UNIQUE,
bio text
);
INSERT INTO users (name, email, bio) VALUES
('Angelika Bartlett', '[email protected]', 'Lorem ipsum dolor sit amet,
consectetur adipisicing elit'),
('Roger Scott', '[email protected]',
'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua'),
('Malia Murray', '[email protected]', 'Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris');
本地服務器腳本(postgres_1)
CREATE EXTENSION postgres_fdw;
CREATE SERVER postgres_2
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (dbname 'database_2', host 'postgres_2', port '5432');
CREATE USER MAPPING FOR CURRENT_USER
SERVER postgres_2
OPTIONS (user 'postgres', password 'postgres_2_pw');
IMPORT FOREIGN SCHEMA "public" limit to (users) FROM SERVER postgres_2 INTO public;
SELECT *
FROM users;
UPDATE users
SET name = 'Ing. Malia Murray'
WHERE id = 3;
DELETE
FROM users
WHERE id = 3;
結論
我希望如果您需要使用Postgres和外部表,此代碼段可以節省幾分鐘。