It is better to be clear than to be clever
本篇测试一下postgres_fdw
1、postgres_fdw理解
fdw是foreign-data wrapper的一个简称,可以叫外部封装数据。
postgres_fdw 是用于postgresql的数据库之间连接,原因是postgresql不能直接跨库访问,被设计用来替代dblink。
2、进入psql
进入后一路回车,输入password(123456),进入pg的命令行。
介绍一下pg的官方文档,网址如下
https://www.postgresql.org/docs/
可以直接搜索你想用的。
3、create extension创建扩展
先\h create extension,可以在命令行中看怎么用,也可以在官方文档看详细的用法。
详细的用法就不再赘述了,直接
create extension postgres_fdw
就可以了。
这样其实有一点不太好,前面回车过去的server、database选项,不能修改了。
那就还是放在anaconda上去运行吧!
上代码。
import psycopg2
conn = psycopg2.connect(
database = 'test',
user = 'postgres',
password = '123456',
host = '127.0.0.1',
port = 5432
)
curs = conn.cursor()
curs.execute(
'''
create extension postgres_fdw;
'''
)
conn.commit()
conn.close()
这样就建立了postgres_fdw的扩展。
这里有一个问题,似乎扩展名必须为postgres_fdw,否则就会报错。
错误为ERROR: could not open extension control file "C:/ProgramFiles/PostgreSQL/10/share/extension/guiheng_fdw.control": No such file or directory
进入这个文件夹,才发现,必须使用以control为扩展名的才能创建扩展,也是有很多个的,不能自己随便起。
可以看到已经创建了扩展。
4、create server创建外部(远程)服务器
后面就不再配图表示了,很好理解。
代码把执行换成如下就行了。
create server diwuheng_server foreign data wrapper postgres_fdw options (host '127.0.0.1', port '5432', dbname 'new');
分析一下这行代码。
diwuheng_server 外部服务器名称,自己起的;
参数:
host '127.0.0.1‘ 因为还是在本机上跑,所以只能是本机的localhost,当然,要是接外部设备的数据库,应该是外部设备的IP;
port 端口号
dbname 创建的外部数据表名。
5、创建用户匹配信息(用户映射)
执行行如下:
postgres=# create user mapping for postgres server diwuheng_server options(user 'postgres',password '123456');
for后面跟的是本地登录执行的用户名。注意不是数据库名test。
参数:
user 用户名
password 密码
可以随便设置,但是好像查询的时候会出问题,所以谨慎起见,就设为如上所示。
6、创建外部表
参考官方文档,代码如下
import psycopg2
conn = psycopg2.connect(
database = 'test',
user = 'postgres',
password = '123456',
host = '127.0.0.1',
port = 5432
)
curs = conn.cursor()
curs.execute(
'''
create foreign table films(
code char(5) not null,
title varchar(40) not null,
did integer not null,
data_prod date,
kind varchar(10),
len interval hour to minute
)
server external_server;
'''
)
conn.commit()
conn.close()
可以看到,已经创建了外部表。
初步试验了一下。还有很多没搞明白,后续会继续更新,加油!