Skip to content

F.16. 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

这是一个布尔选项。如果为 true,则指定不应将列的值与空字符串匹配(即,表级别 null 选项)。这与在 COPYFORCE_NOT_NULL 选项中列出列的效果相同。

force_null

这是一个布尔选项。如果为 true,则指定即使该值带引号,与空字符串匹配的列的值也将作为 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' );

这就是全部内容——现在,您可以直接查询日志。当然,在生产中,您需要定义某种方法来处理日志轮换。