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
指定文件的null字符串,与COPY
的NULL
选项相同。
encoding
指定文件的编码,与COPY
的ENCODING
选项相同。
请注意,当COPY
允许的选项如OIDS和HEADER不带有相应的值被声明时, 外部数据封装器语法在所有的情况下都需要一个值。要激活COPY
选项通常不提供值,不过你可以传递值TRUE。
用这个触发器创建的外部表的一个字段可以有下列的选项:
force_not_null
这是一个布尔选项。如果为真,则声明字段的值不应该匹配空字符串(也就是, 文件级别null
选项)。这与列出COPY
的 FORCE_NOT_NULL
选项里的字段有相同的效果。
file_fdw
目前不支持COPY
的OIDS
和 FORCE_QUOTE
选项。
这些选项只能为外部表或它的字段声明,不是在file_fdw
外部数据封装器的选项里, 也不是在使用该封装器的服务器或用户映射的选项里。
修改表级别的选项需要超级用户权限,因为安全原因:只有超级用户能够决定读哪个文件。 原则上非超级用户可以被允许改变其他选项,但是目前还不支持。
对于一个使用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
) SERVER pglog
OPTIONS ( filename '/home/josh/9.1/data/pg_log/pglog.csv', format 'csv' );
就这样,现在可以查询日志目录。当然,在生产中需要定义一些处理日志回旋的方法。