🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# F.14\. file_fdw `file_fdw`模块提供了外部数据封装器`file_fdw`, 可以用来在服务器的文件系统中访问数据文件。数据文件必须是`COPY FROM` 可读的格式;参阅[COPY](#calibre_link-777)获取细节。访问这样的数据文件当前只是可读的。 使用这个封装器创建的外部表可以有下列选项: `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' ); ``` 就这样,现在可以查询日志目录。当然,在生产中需要定义一些处理日志回旋的方法。