On this page
F.14. file_fdw
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
选项中列出该列具有相同的效果。
- 这是一个布尔选项。如果为 true,则指定该列的值不应与空字符串匹配(即表级
force_null
- 这是一个布尔选项。如果为 true,则指定与空字符串匹配的列的值将被返回为
NULL
,即使该值被引用了。如果没有此选项,则仅将与空字符串匹配的未加引号的值返回为NULL
。这与在COPY
的FORCE_NULL
选项中列出该列具有相同的效果。
- 这是一个布尔选项。如果为 true,则指定与空字符串匹配的列的值将被返回为
file_fdw
目前不支持COPY
的OIDS
和FORCE_QUOTE
选项。
这些选项只能为外部表或其列指定,不能在file_fdw
外部数据包装器的选项中指定,也不能在使用包装器的服务器或用户 Map 的选项中指定。
出于安全考虑,更改表级选项要求是超级用户或具有默认角色pg_read_server_files
(使用文件名)或默认角色pg_execute_server_program
(使用程序)的特权:仅某些用户应能够控制哪个文件被读取或运行哪个程序。原则上可以允许普通用户更改其他选项,但是目前不支持。
指定program
选项时,请记住,选项字符串由 Shell 程序执行。如果需要将来自不受信任来源的任何参数传递给命令,则必须小心删除或转义对 shell 可能具有特殊含义的任何字符。出于安全原因,最好使用固定的命令字符串,或者至少避免在其中传递任何用户 Importing。
对于使用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/data/log/pglog.csv', format 'csv' );
就是这样-现在您可以直接查询日志。当然,在 Producing,您需要定义某种方式来处理日志旋转。