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
选项相同。
encoding
指定数据编码,与 COPY
的 ENCODING
选项相同。
请注意,虽然 COPY
允许在不指定相应值的情况下指定诸如 HEADER
之类的选项,但外部表选项语法要求在所有情况下都必须存在值。要激活通常在不使用值的情况下编写的 COPY
选项,您可以传递值 TRUE,因为所有此类选项都是布尔值。
使用此包装器创建的外部表的列可以具有以下选项
force_not_null
这是一个布尔选项。如果为 true,则指定不应将列的值与空字符串(即表级别的 null
选项)进行匹配。这与在 COPY
的 FORCE_NOT_NULL
选项中列出该列的效果相同。
force_null
这是一个布尔选项。如果为 true,则指定即使值被引用,也会将与空字符串匹配的列值作为 NULL
返回。如果没有此选项,则只有与空字符串匹配的未加引号的值才会作为 NULL
返回。这与在 COPY
的 FORCE_NULL
选项中列出该列的效果相同。
COPY
的 FORCE_QUOTE
选项当前不受 file_fdw
支持。
这些选项只能为外部表或其列指定,而不能在 file_fdw
外部数据包装器的选项中指定,也不能在使用该包装器的服务器或用户映射的选项中指定。
出于安全原因,更改表级选项需要成为超级用户或具有角色 pg_read_server_files
(使用文件名)或角色 pg_execute_server_program
(使用程序)的权限:只有某些用户应该能够控制读取哪个文件或运行哪个程序。原则上,允许普通用户更改其他选项,但目前不支持。
指定 program
选项时,请记住该选项字符串由 shell 执行。如果您需要将来自不受信任的源的任何参数传递给命令,则必须小心地剥离或转义任何可能对 shell 具有特殊含义的字符。出于安全原因,最好使用固定的命令字符串,或者至少避免在其中传递任何用户输入。
对于使用 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, backend_type text, leader_pid integer, query_id bigint ) SERVER pglog OPTIONS ( filename 'log/pglog.csv', format 'csv' );
就是这样了 — 现在您可以直接查询您的日志。当然,在生产中,您需要定义一些方法来处理日志轮换。
示例 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' );
如果您在文档中看到任何不正确的内容、与您使用特定功能的体验不符的内容或需要进一步澄清的内容,请使用此表单报告文档问题。