file_fdw模块提供了外部数据包装器 file_fdw,可用于访问服务器文件系统中的数据文件, 或者在服务器上执行程序并读取其输出。数据文件或程序输出必须采用 COPY FROM 可读取的格式;详见 COPY。 当前对数据文件的访问为只读。
使用此包装器创建的外部表可以具有下列选项:
filename指定要读取的文件。相对路径以数据目录为基准。 必须指定filename或program之一, 但不能同时指定二者。
program指定要执行的命令。该命令的标准输出会按使用 COPY FROM PROGRAM时的方式读取。 必须指定program或filename之一, 但不能同时指定二者。
format指定数据格式,与COPY的FORMAT选项相同。
header指定数据是否包含标题行,与COPY的HEADER选项相同。
delimiter指定数据的定界符字符,与COPY的DELIMITER选项相同。
quote指定数据的引用字符,与COPY的QUOTE选项相同。
escape指定数据的转义字符,与COPY的ESCAPE选项相同。
null指定数据的空值串,与COPY的NULL选项相同。
default指定表示默认值的字符串,与COPY的DEFAULT选项相同。
encoding指定数据编码,与COPY的ENCODING选项相同。
请注意,虽然COPY允许诸如HEADER这样的选项在没有对应值的情况下指定, 但外部表选项语法要求在所有情况下都必须提供一个值。要启用通常写成不带值的 COPY选项,可以传入值 TRUE,因为所有这类选项都是布尔值。
使用此包装器创建的外部表的列可以具有下列选项:
force_not_null这是一个布尔选项。如果为真,它指定该列的值不应与空值串(即表级的 null选项)匹配。其效果与在COPY的 FORCE_NOT_NULL选项中列出该列相同。
force_null这是一个布尔选项。如果为真,它指定该列中与空值串匹配的值即使带有引号, 也会作为NULL返回。没有此选项时,只有未加引号且与空值串匹配的值 才会作为NULL返回。其效果与在COPY的 FORCE_NULL选项中列出该列相同。
file_fdw当前尚不支持COPY的FORCE_QUOTE选项。
这些选项只能在外部表或其列上指定,不能在file_fdw外部数据包装器的选项中指定, 也不能在使用该包装器的服务器或用户映射的选项中指定。
出于安全原因,更改表级选项需要是超级用户,或者拥有角色pg_read_server_files (使用文件名时)或角色pg_execute_server_program(使用程序时)的权限: 只有特定用户才应能够控制读取哪个文件或运行哪个程序。原则上也可以允许普通用户更改其他选项, 但目前尚不支持。
在指定program选项时,请记住,该选项字符串会由 shell 执行。 如果需要向该命令传递来自不受信任来源的参数,必须谨慎去除或转义任何对 shell 可能具有特殊含义的字符。出于安全原因,最好使用固定的命令字符串,或者至少避免向其中传递任何用户输入。
对于使用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, backend_type text, leader_pid integer, query_id bigint ) SERVER pglog OPTIONS ( filename 'log/pglog.csv', format 'csv' );
到这里就完成了 — 现在可以直接查询日志了。当然,在生产环境中, 还需要定义某种方法来处理日志轮转。
Example 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' );
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。