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选项中列出该列具有相同的效果。

file_fdw目前不支持COPYOIDSFORCE_QUOTE选项。

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

出于安全考虑,更改表级选项需要超级用户特权:只有超级用户才可以控制读取哪个文件或运行哪个程序。原则上,可以允许非超级用户更改其他选项,但是目前不支持。

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

对于使用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
) SERVER pglog
OPTIONS ( filename '/home/josh/data/log/pglog.csv', format 'csv' );

就是这样-现在您可以直接查询日志。当然,在 Producing,您需要定义某种方式来处理日志旋转。