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
指定資料 NULL
字串,與 COPY
的 NULL
選項相同。
encoding
指定資料編碼,與 COPY
的 ENCODING
選項相同。
on_error
指定在將列的輸入值轉換為其資料型別時遇到錯誤時的行為,與 COPY
的 ON_ERROR
選項相同。
reject_limit
指定在將列的輸入值轉換為其資料型別時可容忍的最大錯誤數,與 COPY
的 REJECT_LIMIT
選項相同。
log_verbosity
指定 file_fdw
發出的訊息量,與 COPY
的 LOG_VERBOSITY
選項相同。
請注意,雖然 COPY
允許指定不帶相應值的選項(如 HEADER
),但外部表選項語法在所有情況下都需要提供值。要啟用通常不帶值的 COPY
選項,可以傳遞 TRUE
作為值,因為所有這些選項都是布林型的。
使用此包裝器建立的外部表的列可以具有以下選項:
force_not_null
這是一個布林型選項。如果為 true
,則指定列的值不應與 NULL
字串匹配(即,表級別的 null
選項)。這與在 COPY
的 FORCE_NOT_NULL
選項中列出該列的效果相同。
force_null
這是一個布林型選項。如果為 true
,則指定與 NULL
字串匹配的列值即使被引用也將返回為 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
,否則檔案大小(以位元組為單位)也會顯示。
示例 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' );
如果您在文件中發現任何不正確、與您對特定功能的實際體驗不符或需要進一步說明的內容,請使用 此表單 報告文件問題。