受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

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选项相同。

default

指定表示默认值的字符串,与COPYDEFAULT选项相同。

encoding

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

请注意,虽然COPY允许诸如HEADER这样的选项在没有对应值的情况下指定, 但外部表选项语法要求在所有情况下都必须提供一个值。要启用通常写成不带值的 COPY选项,可以传入值 TRUE,因为所有这类选项都是布尔值。

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

force_not_null

这是一个布尔选项。如果为真,它指定该列的值不应与空值串(即表级的 null选项)匹配。其效果与在COPYFORCE_NOT_NULL选项中列出该列相同。

force_null

这是一个布尔选项。如果为真,它指定该列中与空值串匹配的值即使带有引号, 也会作为NULL返回。没有此选项时,只有未加引号且与空值串匹配的值 才会作为NULL返回。其效果与在COPYFORCE_NULL选项中列出该列相同。

file_fdw当前尚不支持COPYFORCE_QUOTE选项。

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

出于安全原因,更改表级选项需要是超级用户,或者拥有角色pg_read_server_files (使用文件名时)或角色pg_execute_server_program(使用程序时)的权限: 只有特定用户才应能够控制读取哪个文件或运行哪个程序。原则上也可以允许普通用户更改其他选项, 但目前尚不支持。

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

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

Example 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' );

到这里就完成了 — 现在可以直接查询日志了。当然,在生产环境中, 还需要定义某种方法来处理日志轮转。


Example 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' );

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。