file_fdw
是一个 contrib 模块,它提供了一个 外部数据包装器 (FDW),使能够将服务器本地文件系统上的文件查询为表。这些文件必须采用 COPY ... FROM 命令支持的格式之一(text
、csv
或 binary
)。file_fdw
是只读的。
file_fdw
在 PostgreSQL 9.1 中添加。
安装
必须由超级用户使用 CREATE EXTENSION
语法将 file_fdw
扩展安装到需要其功能的数据库中。
权限
在 PostgreSQL 11 之前,只有超级用户可以使用 file_fdw
从操作系统读取文件。从 PostgreSQL 11 开始,以下 默认角色 可用于启用非超级用户使用 file_fdw
pg_read_server_files
pg_write_server_files
pg_execute_server_program
更改历史记录
- PostgreSQL 10
file_fdw
可以读取程序的输出以及文件(提交 8e91e12b)
- PostgreSQL 9.4
- 添加了
force_null
选项(提交 3b5e03dc)
- 添加了
- PostgreSQL 9.2
- 添加了
force_not_null
选项(提交 86a3f2d4)
- 添加了
- PostgreSQL 9.1
- 添加(提交 7c5d0ae7)
示例
作为一个人为的例子,将以下示例 CSV 文件保存为/tmp/file_fdw-test.csv:
ID,Message,Random numbers 1,Hello world,34432532 2,Goodbye cruel world,97325644
要查询此文件,请设置一个与先前创建的外部服务器关联的 外部表,该表包含定义为与 CSV 文件中的列匹配的列。外部表定义还包含文件的位置(数据库的系统用户必须能够读取该文件)。请注意,必须以超级用户身份执行外部表定义,因为源文件将以数据库系统用户的权限读取,这存在潜在的安全风险。
适合读取示例文件的外部表为
CREATE EXTENSION file_fdw; CREATE SERVER file_fdw_test_srv FOREIGN DATA WRAPPER file_fdw; CREATE FOREIGN TABLE csv_test ( id INT, message TEXT, randnrs BIGINT ) SERVER file_fdw_test_srv OPTIONS ( filename '/tmp/file_fdw-test.csv', format 'csv', header 'TRUE' )
然后可以像查询普通表一样查询该文件
postgres=# SELECT * FROM csv_test; id | message | randnrs ----+---------------------+---------- 1 | Hello world | 34432532 2 | Goodbye cruel world | 97325644 (2 rows)