支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 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

这是一个布尔值选项。如果为 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' );

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


示例 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' );

提交更正

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