PostgreSQL中如何將對象oid和對象名相互轉(zhuǎn)換
PostgreSQL中將對象oid轉(zhuǎn)為對象名
使用pg的內(nèi)部數(shù)據(jù)類型將對象oid轉(zhuǎn)為對象名,可以簡化一些系統(tǒng)視圖的關聯(lián)查詢。
數(shù)據(jù)庫類型轉(zhuǎn)換對應類型的oid
可以用以下數(shù)據(jù)庫類型轉(zhuǎn)換對應類型的oid(以pg12為例)
postgres=# select typname from pg_type where typname ~ '^reg'; typname --------------- regclass regconfig regdictionary regnamespace regoper regoperator regproc regprocedure regrole regtype (10 rows)
對應關系
對象名稱 | 類型 | 轉(zhuǎn)換規(guī)則 |
---|---|---|
pg_class | regclass | pg_class.oid::regclass |
pg_ts_dict | regdictionary | pg_ts_dict.oid::regdictionary |
pg_namespace | regnamespace | pg_namespace.oid::regnamespace |
pg_operator | regoperator | pg_operator.oid::regoperator |
pg_proc | regproc | pg_proc.oid::regproc |
pg_roles pg_user | regrole | pg_roles.oid::regrole pg_user.usesysid::regrole |
pg_type | regtype | pg_type.oid::regtype |
以下幾個類型暫不確定用途,待研究: | ||
regprocedure | ||
regoper | ||
regconfig |
創(chuàng)建測試數(shù)據(jù)
psql -U postgres create user test password 'test'; create database testdb with owner=test; \c testdb CREATE SCHEMA AUTHORIZATION test; psql -U test -d testdb create table test_t1(id int); create table test_t2(id int); create table test_t3(id int);
基于如上測試數(shù)據(jù),查詢test模式下有哪些表,以及表的owner
傳統(tǒng)表關聯(lián)的方式使用以下SQL,關聯(lián)pg_class、pg_namespace、pg_roles/pg_user
psql -U test -d testdb -- 查詢用戶關聯(lián)pg_user查詢 SELECT t3.nspname AS SCHEMA, t1.relname AS tablename, t2.usename AS OWNER FROM pg_class t1 JOIN pg_user t2 ON t1.relowner = t2.usesysid JOIN pg_namespace t3 ON t1.relnamespace = t3.OID WHERE t1.relkind = 'r' AND t3.nspname = 'test'; schema | tablename | owner --------+-----------+------- test | test_t1 | test test | test_t2 | test test | test_t3 | test (3 rows) -- 查詢用戶關聯(lián)pg_roles查詢 SELECT t3.nspname AS SCHEMA, t1.relname AS tablename, t2.rolname AS OWNER FROM pg_class t1 JOIN pg_roles t2 ON t1.relowner = t2.oid JOIN pg_namespace t3 ON t1.relnamespace = t3.OID WHERE t1.relkind = 'r' AND t3.nspname = 'test'; schema | tablename | owner --------+-----------+------- test | test_t1 | test test | test_t2 | test test | test_t3 | test (3 rows)
如上為了實現(xiàn)查詢效果需要關聯(lián)三張表,查詢比較繁瑣,如果使用對象轉(zhuǎn)換就很簡單了,如下:
psql -U test -d testdb SELECT relnamespace :: REGNAMESPACE AS SCHEMA, relname AS tablename, relowner :: REGROLE AS OWNER FROM pg_class WHERE relnamespace :: REGNAMESPACE :: TEXT = 'test' AND relkind = 'r'; schema | tablename | owner --------+-----------+------- test | test_t1 | test test | test_t2 | test test | test_t3 | test (3 rows)
將對象名轉(zhuǎn)為oid類型
轉(zhuǎn)換關系
對象類型 | 轉(zhuǎn)換規(guī)則 |
---|---|
table | '表名'::regclass::oid |
function/procedure | '函數(shù)名/存儲過程名'::regproc::oid |
schema | '模式名'::regnamespace::oid |
user/role | '用戶名/角色名'::regrole::oid |
type | '類型名稱'::regtype::oid |
測試示例
表轉(zhuǎn)換
drop table if exists test_t; create table test_t(id int); postgres=# select oid from pg_class where relname = 'test_t'; oid ------- 16508 (1 row) postgres=# select 'test_t'::regclass::oid; oid ------- 16508 (1 row)
函數(shù)轉(zhuǎn)換
CREATE OR REPLACE FUNCTION test_fun( arg1 INTEGER, arg2 INTEGER, arg3 TEXT ) RETURNS INTEGER AS $$ BEGIN RETURN arg1 + arg2; END; $$ LANGUAGE plpgsql; postgres=# select oid,proname from pg_proc where proname = 'test_fun'; oid | proname -------+---------- 16399 | test_fun (1 row) postgres=# select 'test_fun'::regproc::oid; oid ------- 16399 (1 row)
模式轉(zhuǎn)換
create schema test_schema; postgres=# select oid,nspname from pg_namespace where nspname='test_schema'; oid | nspname -------+------------- 16511 | test_schema (1 row) postgres=# select 'test_schema'::regnamespace::oid; oid ------- 16511 (1 row)
用戶/角色
create user test_user; postgres=# select usesysid,usename from pg_user where usename='test_user'; usesysid | usename ----------+----------- 16512 | test_user (1 row) postgres=# select 'test_user'::regrole::oid; oid ------- 16512 (1 row)
類型
CREATE TYPE type_sex AS ENUM ('male', 'female'); postgres=# select oid,typname from pg_type where typname='type_sex'; oid | typname -------+---------- 16514 | type_sex (1 row) postgres=# select 'type_sex'::regtype::oid; oid ------- 16514 (1 row)
到此這篇關于PostgreSQL中將對象oid和對象名相互轉(zhuǎn)換的文章就介紹到這了,更多相關PostgreSQL對象oid和對象名轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
本地計算機上的 postgresql 服務啟動后停止的問題解決
這篇文章主要介紹了本地計算機上的 postgresql 服務啟動后停止的問題解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01PostgreSQL LIST、RANGE 表分區(qū)的實現(xiàn)方案
這篇文章主要介紹了PostgreSQL LIST、RANGE 表分區(qū)的實現(xiàn)方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01如何將excel表格數(shù)據(jù)導入postgresql數(shù)據(jù)庫
這篇文章主要介紹了如何將excel表格數(shù)據(jù)導入postgresql數(shù)據(jù)庫,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03PostgreSQL pg_ctl start啟動超時實例分析
這篇文章主要給大家介紹了關于PostgreSQL pg_ctl start啟動超時的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-01-01