Postgresql
將“regclass”值轉換為文本時缺少“公共”模式
我正在編寫一個腳本,我需要在其中解析一個表的名稱(in
regclass
)。解析 (withparse_ident()
) 到目前為止有效。但是,當表在public
模式中時,腳本會失敗,因為 PostgreSQL (10.3) 會自動刪除模式名稱。例如,如果表
tt
在非public
模式ex
中,則 的文本值regclass
與原始值相同:=> select 'ex.tt'::regclass::text; text ------- ex.tt
當它在 中時
public
,模式名稱會失去:=> select 'public.tt'::regclass::text; text ------ tt
有沒有辦法禁用這種行為,或者在
text
不失去模式名稱的情況下轉換為?
public
這與模式本身無關——它只是另一個沒有特殊權力的模式,除了它是預設創建的——並且預設包含在其中search_path
。電流**
search_path
**在這背後。值的文本表示regclass
建立在它之上。如果模式不是第一個匹配項,則表名僅是模式限定的search_path
。手冊:輸入轉換器根據
regclass
模式路徑設置處理表查找,因此它會自動執行“正確的事情”。同樣,將表的 OID 轉換regclass
為數字 OID 的符號顯示很方便。
search_path
您可以通過設置一個空(本地)來強制 Postgres 列印模式名稱:SET LOCAL search_path = ''; SELECT 'public.tt'::regclass::text;
但這會迫使您為事務的其餘部分或直到您
search_path
再次設置所有內容進行模式限定。好吧,幾乎所有東西,pg_catalog
都是pg_temp
特別的。看:或者您避免特殊演員表和直接
search_path
從中獲取架構名稱pg_class
:SELECT relnamespace::regnamespace::text FROM pg_catalog.pg_class WHERE oid = 'public.tt'::regclass;