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
選項中列出欄位相同的效果。
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' );
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的地方,請使用此表單來報告文件問題。