2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

F.15. file_fdw — 訪問伺服器檔案系統中的資料檔案 #

file_fdw 模組提供了名為 file_fdw 的外部資料包裝器,可用於訪問伺服器檔案系統中的資料檔案,或在伺服器上執行程式並讀取其輸出。資料檔案或程式輸出必須是 COPY FROM 可讀的格式;有關詳細資訊,請參閱 COPY。目前,對資料檔案的訪問是隻讀的。

使用此包裝器建立的外部表可以具有以下選項:

filename

指定要讀取的檔案。相對路徑相對於資料目錄。必須指定 filenameprogram,但不能同時指定兩者。

program

指定要執行的命令。此命令的標準輸出將像使用 COPY FROM PROGRAM 一樣被讀取。必須指定 programfilename,但不能同時指定兩者。

format

指定資料格式,與 COPYFORMAT 選項相同。

header

指定資料是否具有標題行,與 COPYHEADER 選項相同。

delimiter

指定資料分隔符字元,與 COPYDELIMITER 選項相同。

quote

指定資料引用字元,與 COPYQUOTE 選項相同。

escape

指定資料跳脫字元,與 COPYESCAPE 選項相同。

null

指定資料 NULL 字串,與 COPYNULL 選項相同。

encoding

指定資料編碼,與 COPYENCODING 選項相同。

on_error

指定在將列的輸入值轉換為其資料型別時遇到錯誤時的行為,與 COPYON_ERROR 選項相同。

reject_limit

指定在將列的輸入值轉換為其資料型別時可容忍的最大錯誤數,與 COPYREJECT_LIMIT 選項相同。

log_verbosity

指定 file_fdw 發出的訊息量,與 COPYLOG_VERBOSITY 選項相同。

請注意,雖然 COPY 允許指定不帶相應值的選項(如 HEADER),但外部表選項語法在所有情況下都需要提供值。要啟用通常不帶值的 COPY 選項,可以傳遞 TRUE 作為值,因為所有這些選項都是布林型的。

使用此包裝器建立的外部表的列可以具有以下選項:

force_not_null

這是一個布林型選項。如果為 true,則指定列的值不應與 NULL 字串匹配(即,表級別的 null 選項)。這與在 COPYFORCE_NOT_NULL 選項中列出該列的效果相同。

force_null

這是一個布林型選項。如果為 true,則指定與 NULL 字串匹配的列值即使被引用也將返回為 NULL。沒有此選項,只有未被引用的匹配 NULL 字串的值才會被返回為 NULL。這與在 COPYFORCE_NULL 選項中列出該列的效果相同。

file_fdw 目前不支援 COPYFORCE_QUOTE 選項。

這些選項只能為外部表或其列指定,不能在 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' );

提交更正

如果您在文件中發現任何不正確、與您對特定功能的實際體驗不符或需要進一步說明的內容,請使用 此表單 報告文件問題。