PostgreSQL的dblink擴展模塊使用
PostgreSQL想要在A庫下查詢B庫的表,可以使用dblink插件。PostgreSQL的dblink是一個支持在一個數(shù)據(jù)庫會話中連接到其他PostgreSQL數(shù)據(jù)庫的擴展模塊,可以實現(xiàn)在不同的數(shù)據(jù)庫之間進行通信和交互。
它可以讓你在一個數(shù)據(jù)庫中訪問另一個數(shù)據(jù)庫的表和函數(shù),甚至可以在不同的服務器之間進行數(shù)據(jù)交互。
pgsql9.6版本以后自帶,不需要手動安裝,另外PG使用dblink執(zhí)行一個遠程查詢時,必須在調用時定義返回的列名和類型。
dblink用法
創(chuàng)建 pg dblink擴展
CREATE EXTENSION IF NOT EXISTS dblink;
###如果已經有,可以在 pg 擴展表查到
SELECT * FROM pg_extension WHERE extname = 'dblink';
或使用\dx
postgres=# \dx
已安裝擴展列表
名稱 | 版本 | 架構模式 | 描述
--------------------+------+------------+------------------------------------------------------------------------
adminpack | 2.1 | pg_catalog | administrative functions for PostgreSQL
dblink | 1.2 | postgres | connect to other PostgreSQL databases from within a database
oracle_fdw | 1.2 | postgres | foreign data wrapper for Oracle access
pg_stat_statements | 1.9 | postgres | track planning and execution statistics of all SQL statements executed
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language建立遠程連接
SELECT dblink_connect('local_connect','hostaddr=127.0.0.1 port=5432 dbname=xxxx user=xxxx password=xxxx') as dev;
解釋:
'local_connect' 是我自定義的連接的名稱
hostaddr=127.0.0.1 表示是本機地址
port=5432 表示使用5432端口,自行設置
dbname 表示要訪問的數(shù)據(jù)庫的名稱
user,password分別表示用戶名和密碼,根據(jù)自己配置的用戶名密碼更改
如:
postgres=# SELECT dblink_connect('local_connect','hostaddr=127.0.0.1 port=5432 dbname=hrdb user=hr password=hr') as dev;
dev
-----
OK
(1 行記錄)
-- 查詢所有已鏈接的dblink
select dblink_get_connections();PS:
當dblink連接的是同一個PG實例下的不同數(shù)據(jù)庫時,hostaddr就寫 127.0.0.1,不用寫實際的實例地址。
當是不同實例時,需要寫正確的實例,且這兩個實例地址間網(wǎng)絡是通的。
查詢所有已鏈接的dblink
postgres=# select dblink_get_connections();
dblink_get_connections
------------------------
{local_connect}
(1 行記錄)
執(zhí)行查詢
--跨庫查詢
SELECT num,id FROM dblink('local_connect','select num,id from hr.demotable') as t(num numeric,id integer);
SELECT * FROM dblink('local_connect','select num,id from hr.demotable') as t(num numeric,id integer);
SELECT * FROM dblink('local_connect','select * from hr.demotable') as t(num numeric,id integer);
--跨庫查詢寫入
insert into t_dblink
select * from dblink('hostaddr=127.0.0.1 port=5432 dbname=hrdb user=hr password=hr','select * from hr.demotable where id<1000') as t(num numeric,id integer);
####使用 dblink 函數(shù)從遠程數(shù)據(jù)庫獲取數(shù)據(jù)。 local_connect是預先配置好的遠程數(shù)據(jù)庫連接名
####dblink 中查詢語句被引號括起來,如果查詢語句本身有引號,需要多寫一個引號做轉義
####AS t()表示dblink返回的結果集定義了一個別名't',并指定了每個列的數(shù)據(jù)類型
關閉連接
-- 關閉遠程連接
###在PostgreSQL中dblink是會話級別;會話斷開即dblink也關閉。當然也可以在會話中手動關閉
SELECT dblink_disconnect('local_connect');
-- 查詢所有已鏈接的dblink
select dblink_get_connections();
dblink 擴展
簡便寫法
上面使用方法比較繁瑣,要先創(chuàng)建 dblink連接才能使用,也可以寫成下面這種方式,在一個語句中完成:
--直接寫 dblink 方式,預先配置好的到遠程數(shù)據(jù)庫的連接名
SELECT * FROM dblink('hostaddr=127.0.0.1 port=5432 dbname=hrdb user=hr password=hr','select * from hr.demotable') as t(num numeric,id integer);
create table t_dblink as select * from dblink('hostaddr=127.0.0.1 port=5432 dbname=hrdb user=hr password=hr','select * from hr.demotable where 1=2') as t(num numeric,id integer);
insert into t_dblink
select * from dblink('hostaddr=127.0.0.1 port=5432 dbname=hrdb user=hr password=hr','select * from hr.demotable where id<1000') as t(num numeric,id integer);
explain analyze with t_temp as (select * from dblink('hostaddr=127.0.0.1 port=5432 dbname=hrdb user=hr password=hr','select * from hr.demotable where id<1000') as t(num numeric,id integer))
select a.num,a.id from t_dblink a,t_temp b where a.id=b.id;
使用dblink查詢要帶有conn_str,非常不簡潔,可以考慮在會話使用臨時表/視圖來保存。
臨時表調用方式
postgres=# create temp table t_dblink as SELECT * FROM dblink('hostaddr=127.0.0.1 port=5432 dbname=hrdb user=hr password=hr','select * from hr.demotable') as t(num numeric,id integer);
SELECT 1000000
postgres=# select * from t_dblink;
...........
--退出后重新進去臨時表不存在
postgres=# select * from t_dblink;
錯誤: 關系 "t_dblink" 不存在
第1行select * from t_dblink;
視圖調用方式
如果認為每次查詢都要寫dblink的一堆信息很麻煩的話,可以在db中建一個view來解決
postgres=# create view v_dblink as SELECT * FROM dblink('hostaddr=127.0.0.1 port=5432 dbname=hrdb user=hr password=hr','select * from hr.demotable') as t(num numeric,id integer);
CREATE VIEW
postgres=# select * from v_dblink;
................
--退出后,重新執(zhí)行
postgres=# select * from v_dblink;
到底選擇視圖/臨時表,看你需求。在PostgreSQL中臨時表在會話結束后是不會保持的,這樣的好處:不使用的話無需去刪除對應的臨時表。
跨庫執(zhí)行ddl/dml操作
–如果需要跨庫執(zhí)行ddl、dml操作,使用dblink_exec
SELECT dblink_connect('local_connect','hostaddr=127.0.0.1 port=5432 dbname=hrdb user=hr password=hr') as dev;
SELECT dblink_exec('local_connect', 'create table aa(id int,name varchar(50))');
SELECT dblink_exec('local_connect', 'drop table aa');
SELECT dblink_exec('local_connect', 'insert into hr.t values (1011102,8999,''hello'',''2048-10-09''::date)');
SELECT dblink_exec('local_connect', 'delete from hr.t values where id=1011102');總結
PostgreSQL使用這種dblink,存在優(yōu)勢是即取即用,無須在創(chuàng)建其他對象;劣勢是只能連通posrgresql的不同數(shù)據(jù)庫,不能進行異構數(shù)據(jù)庫的連通。當然如果需要連接異構的數(shù)據(jù)庫,可以使用Foreign Data Wrapper(FDW)插件,后面再來說說這個的使用方法。
到此這篇關于PostgreSQL的dblink擴展模塊使用的文章就介紹到這了,更多相關PostgreSQL dblink擴展內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Postgresql去重函數(shù)distinct的用法說明
這篇文章主要介紹了Postgresql去重函數(shù)distinct的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL 實現(xiàn)distinct關鍵字給單獨的幾列去重
這篇文章主要介紹了PostgreSQL 實現(xiàn)distinct關鍵字給單獨的幾列去重,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01

