F.14. file_fdw

file_fdw模块提供了外部数据封装器file_fdw, 可以用来在服务器的文件系统中访问数据文件。数据文件必须是COPY FROM 可读的格式;参阅COPY获取细节。访问这样的数据文件当前只是可读的。

使用这个封装器创建的外部表可以有下列选项:

filename

指定要读取的文件。这是必需的。必须是一个绝对路径名。

format

指定文件的格式,与COPYFORMAT选项相同。

header

指定文件是否有标题行,与COPYHEADER选项相同。

delimiter

指定文件的分隔符,与COPYDELIMITER选项相同。

quote

指定文件的引用字符,与COPYQUOTE选项相同。

escape

指定文件的转义字符,与COPYESCAPE选项相同。

null

指定文件的null字符串,与COPYNULL选项相同。

encoding

指定文件的编码,与COPYENCODING选项相同。

请注意,当COPY允许的选项如OIDS和HEADER不带有相应的值被声明时, 外部数据封装器语法在所有的情况下都需要一个值。要激活COPY 选项通常不提供值,不过你可以传递值TRUE。

用这个触发器创建的外部表的一个字段可以有下列的选项:

force_not_null

这是一个布尔选项。如果为真,则声明字段的值不应该匹配空字符串(也就是, 文件级别null选项)。这与列出COPYFORCE_NOT_NULL选项里的字段有相同的效果。

force_null

这是一个布尔选项。如果为真,它声明匹配空字符串的字段的值作为NULL 返回,即使该值加了引号。没有这个选项,只有未加引号的匹配该空字符串的值作为 NULL返回。这和在COPYFORCE_NULL 选项中监听该字段有相同的效果。

file_fdw目前不支持COPYOIDSFORCE_QUOTE选项。

这些选项只能为外部表或它的字段声明,不是在file_fdw外部数据封装器的选项里, 也不是在使用该封装器的服务器或用户映射的选项里。

修改表级别的选项需要超级用户权限,因为安全原因:只有超级用户能够决定读哪个文件。 原则上非超级用户可以被允许改变其他选项,但是目前还不支持。

对于一个使用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/9.1/data/pg_log/pglog.csv', format 'csv' );

就这样,现在可以查询日志目录。当然,在生产中需要定义一些处理日志回旋的方法。