teledb-x与telepg的dblink插件互连测试
1.准备2套集群
集群1:teledb-x的分布式集群,连接地址:127.0.0.1/12121,用户名密码:tangyujie/密码
集群2:telepg的集中式集群,连接地址:127.0.0.1/1234,用户名密码:tangyujie/密码
--分布式集群teledb-x
$ ./psql -p 12121 -d postgres -W
Password:
psql (PostgreSQL 10.0 TeleDBX V6)
Type "help" for help.
postgres=# \dx
List of installed extensions
Name | Version | Schema | Description
--------------+---------+------------+------------------------------
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
teledbx_core | 1.0 | public | core module of teledbx
(2 rows)
postgres=# create table t1(id int primary key,name varchar(11));
CREATE TABLE
postgres=# insert into t1 values(1,'中国'),(2,'美国');
COPY 2
postgres=# \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+-----------
public | t1 | table | tangyujie
(1 row)
--集中式集群telepg
$ ./psql -p 1234 -d postgres -W
Password:
psql (10.23)
Type "help" for help.
postgres=# create table test(id int primary key,name varchar(11));
CREATE TABLE
postgres=# insert into test values(1,'hello'),(2,'world');
INSERT 0 2
postgres=# \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+-----------
public | test | table | tangyujie
(1 row)
2.分布式dblink连接到telepg
--创建插件
postgres=# create extension dblink ;
CREATE EXTENSION
postgres=# \dx
List of installed extensions
Name | Version | Schema | Description
--------------+---------+------------+--------------------------------------------------------------
dblink | 1.2 | public | connect to other PostgreSQL databases from within a database
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
teledbx_core | 1.0 | public | core module of teledbx
(3 rows)
--创建连接: 使用dblink连接到另一个数据库,需要指定连接参数,例如主机名、端口号、用户名和密码等
postgres=# SELECT dblink_connect('dblink_name', 'dbname=postgres host=127.0.0.1 port=1234 user=tangyujie password=密码');
dblink_connect
----------------
OK
(1 row)
--查询数据
postgres=# SELECT * FROM dblink('dblink_name', 'SELECT * FROM test') AS t(id int, name text);
id | name
----+-------
1 | hello
2 | world
(2 rows)
--远程表与本地表关联查询
SELECT t1.id, t1.name AS local_name, t.name AS remote_name
FROM t1
JOIN (
SELECT * FROM dblink('dblink_name', 'SELECT id, name FROM test')
AS t(id INT, name TEXT)
) AS t
ON t1.id = t.id;
id | local_name | remote_name
----+------------+-------------
1 | 中国 | hello
2 | 美国 | world
(2 rows)
--执行函数
postgres=# SELECT dblink('dblink_name', 'SELECT txid_current();');
ERROR: function returning record called in context that cannot accept type record
postgres=# SELECT * FROM dblink('dblink_name', 'SELECT txid_current()') AS t(txid bigint);
txid
-------
83175
(1 row)
--关闭连接
postgres=# SELECT dblink_disconnect('dblink_name');
dblink_disconnect
-------------------
OK
(1 row)
--其他接口
1、dblink_connect 打开一个到远程数据库的持久连接
2、dblink_connect_u 不安全地打开一个到远程数据库的持久连接
3、dblink_disconnect 关闭一个到远程数据库的持久连接
4、dblink 在一个远程数据库中执行一个查询
5、dblink_exec 在一个远程数据库中执行一个命令
6、dblink_open 在一个远程数据库中打开一个游标
7、dblink_fetch 从一个远程数据库中的打开的游标返回行
8、dblink_close 关闭一个远程数据库中的游标
9、dblink_get_connections 返回所有打开的命名 dblink 连接的名称
10、dblink_error_message 得到在命名连接上的最后一个错误消息
11、dblink_send_query 发送一个异步查询到远程数据库
12、dblink_is_busy 检查连接是否正在忙于一个异步查询
13、dblink_get_notify 在一个连接上检索异步通知
14、dblink_get_result 得到一个异步查询结果
15、dblink_cancel_query 在命名连接上取消任何活动查询
16、dblink_get_pkey 返回一个关系的主键域的位置和域名称
17、dblink_build_sql_insert 使用一个本地元组构建一个 INSERT 语句,将主键域值替换为提供的值
18、dblink_build_sql_delete 使用所提供的主键域值构建一个 DELETE 语句
19、dblink_build_sql_update 使用一个本地元组构建一个 UPDATE 语句,将主键域值替换为提供的值
3.集中式dblink连接到teledb-x
--创建插件
postgres=# create extension dblink ;
CREATE EXTENSION
postgres=# \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+--------------------------------------------------------------
dblink | 1.2 | public | connect to other PostgreSQL databases from within a database
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
--创建连接: 使用dblink连接到另一个数据库,需要指定连接参数,例如主机名、端口号、用户名和密码等
postgres=# SELECT dblink_connect('dblink_name', 'dbname=postgres host=127.0.0.1 port=12121 user=tangyujie password=密码');
dblink_connect
----------------
OK
(1 row)
--查询数据
postgres=# SELECT * FROM dblink('dblink_name', 'SELECT * FROM t1') AS t(id int, name text);
id | name
----+------
1 | 中国
2 | 美国
(2 rows)
--执行函数
postgres=# SELECT dblink('dblink_name', 'SELECT txid_current();');
ERROR: function returning record called in context that cannot accept type record
postgres=# SELECT dblink('dblink_name', 'SELECT pgxc_node_str()');
ERROR: function returning record called in context that cannot accept type record
--关闭连接
postgres=# SELECT dblink_disconnect('dblink_name');
dblink_disconnect
-------------------
OK
(1 row)
结论
1.上述集中式telepg和分布式teledb-x采用dblink插件进行互联是可以的。
2.执行函数会报错:function returning record called in context that cannot accept type record。