目录
介绍
我已经与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', 'angelika.bartlett@example.com', 'Lorem ipsum dolor sit amet,
consectetur adipisicing elit'),
('Roger Scott', 'roger.scott@example.com',
'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua'),
('Malia Murray', 'malia.murray@example.com', '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和外部表,此代码段可以节省几分钟。