F.14. file_fdw
file_fdw模块提供外部数据包装器file_fdw
,它能被用来访问服务器的文件系统中的数据文件。数据文件必须是能够被COPY FROM读取的格式,详见COPY。当前只能读取这种数据文件。
用这个包装器创建的一个外部表可以有下列选项:
- filename
指定要被读取的文件。必须。必须是一个绝对路径名。
- format
指定文件的格式,和COPY的FORMAT选项相同。
- header
指定该文件是否具有一个头部行,和COPY的HEADER选项相同。
- delimiter
指定该文件的定界符字符,和COPY的DELIMITER选项相同。
- quote
指定该文件的引用字符,和COPY的QUOTE选项相同。
- escape
指定该文件的转义字符,和COPY的ESCAPE选项相同。
- null
指定该文件的空字符串,和COPY的NULL选项相同。
- encoding
指定该文件的编码,和COPY的ENCODING选项相同。
注意虽然COPY允许诸如 OIDS 和 HEADER 的选项不用一个相应的值指定,但是外部数据包装器语法要求在所有情况下都出现一个值。要激活通常不提供值的COPY选项,你可以传递值 TRUE。
使用这个包装器创建的表的一列可以具有下列选项:
- force_not_null
这是一个布尔选项。如果为真,它指定该列的值不应该与空字符串匹配(也就是文件级别的null选项)。这和把该列放在COPY的FORCE_NOT_NULL选项中具有相同的效果。
- force_null
这是一个布尔选项。如果为真,它指定匹配空值字符串的列值会被返回为NULL, 即使该值被引号引用。如果没有这个选项,只有匹配空值字符串的未被引用的值会被返回为 NULL。这和在COPY的FORCE_NULL 选项中列出该列有同样的效果。
COPY的OIDS和FORCE_QUOTE选项当前不被file_fdw支持。
这些选项只能为一个外部表及其列指定,而不能在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' );
就是这样了 — 现在你能够直接查询你的日志了。当然,在生产中你会需要定义一些方法来处理日志轮转。