2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:开发版
不受支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

F.15. file_fdw — 访问服务器文件系统中的数据文件 #

file_fdw 模块提供了外部数据包装器 file_fdw,它可以用来访问服务器文件系统中的数据文件,或在服务器上执行程序并读取其输出。数据文件或程序输出必须采用 COPY FROM 可以读取的格式;有关详细信息,请参阅 COPY。目前,对数据文件的访问仅限于只读。

使用此包装器创建的外部表可以具有以下选项

filename

指定要读取的文件。相对路径相对于数据目录。必须指定 filenameprogram,但不能同时指定两者。

program

指定要执行的命令。此命令的标准输出将被读取,就像使用了 COPY FROM PROGRAM 一样。必须指定 programfilename,但不能同时指定两者。

format

指定数据格式,与 COPYFORMAT 选项相同。

header

指定数据是否具有标题行,与 COPYHEADER 选项相同。

delimiter

指定数据分隔符字符,与 COPYDELIMITER 选项相同。

quote

指定数据引用字符,与 COPYQUOTE 选项相同。

escape

指定数据转义字符,与 COPYESCAPE 选项相同。

null

指定数据空字符串,与 COPYNULL 选项相同。

encoding

指定数据编码,与 COPYENCODING 选项相同。

请注意,虽然 COPY 允许在没有相应值的情况下指定诸如 HEADER 之类的选项,但外部表选项语法要求在所有情况下都存在值。要激活通常不带值的 COPY 选项,您可以传递值 TRUE,因为所有此类选项都是布尔值。

使用此包装器创建的外部表的列可以具有以下选项

force_not_null

这是一个布尔选项。如果为真,则表示不应将该列的值与空字符串(即表级 null 选项)进行匹配。这与在 COPYFORCE_NOT_NULL 选项中列出该列具有相同的效果。

force_null

这是一个布尔选项。如果为真,则表示与空字符串匹配的该列的值将返回为 NULL,即使该值被引用也是如此。如果没有此选项,则只有与空字符串匹配的未引用值将返回为 NULL。这与在 COPYFORCE_NULL 选项中列出该列具有相同的效果。

COPYFORCE_QUOTE 选项目前不受 file_fdw 支持。

这些选项只能为外部表或其列指定,不能在 file_fdw 外部数据包装器的选项中指定,也不能在使用该包装器的服务器或用户映射的选项中指定。

出于安全原因,更改表级选项需要成为超级用户或具有角色 pg_read_server_files(使用文件名)或角色 pg_execute_server_program(使用程序)的权限:只有某些用户才能控制读取哪个文件或运行哪个程序。原则上,可以允许普通用户更改其他选项,但这目前不受支持。

在指定 program 选项时,请记住该选项字符串由 shell 执行。如果您需要传递来自不受信任来源的任何参数给命令,则必须小心地剥离或转义对 shell 具有特殊含义的任何字符。出于安全原因,最好使用固定的命令字符串,或者至少避免在其中传递任何用户输入。

对于使用 file_fdw 的外部表,EXPLAIN 显示要读取的文件或要运行的程序的名称。对于文件,除非指定了 COSTS OFF,否则还会显示文件大小(以字节为单位)。

示例 F.1. 为 PostgreSQL CSV 日志创建外部表

file_fdw 的一个明显用途是使 PostgreSQL 活动日志作为可供查询的表可用。为此,首先您必须将日志记录到 CSV 文件中,这里我们将其称为 pglog.csv。首先,将 file_fdw 作为扩展安装

CREATE EXTENSION file_fdw;

然后创建一个外部服务器

CREATE SERVER pglog FOREIGN DATA WRAPPER file_fdw;

现在您可以创建外部数据表了。使用 CREATE FOREIGN TABLE 命令,您需要为表定义列、CSV 文件名及其格式

CREATE FOREIGN TABLE pglog (
  log_time timestamp(3) with time zone,
  user_name text,
  database_name text,
  process_id integer,
  connection_from text,
  session_id text,
  session_line_num bigint,
  command_tag text,
  session_start_time timestamp with time zone,
  virtual_transaction_id text,
  transaction_id bigint,
  error_severity text,
  sql_state_code text,
  message text,
  detail text,
  hint text,
  internal_query text,
  internal_query_pos integer,
  context text,
  query text,
  query_pos integer,
  location text,
  application_name text,
  backend_type text,
  leader_pid integer,
  query_id bigint
) SERVER pglog
OPTIONS ( filename 'log/pglog.csv', format 'csv' );

就是这样——现在您可以直接查询您的日志了。当然,在生产环境中,您需要定义某种方法来处理日志轮换。


示例 F.2. 使用列上的选项创建外部表

要为列设置 force_null 选项,请使用 OPTIONS 关键字。

CREATE FOREIGN TABLE films (
 code char(5) NOT NULL,
 title text NOT NULL,
 rating text OPTIONS (force_null 'true')
) SERVER film_server
OPTIONS ( filename 'films/db.csv', format 'csv' );

提交更正

如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用 此表单 报告文档问题。