Python中如何通过单次SQL查询访问两个不同服务器的数据表
跨不同服务器表关联查询实现方案
跨服务器单SQL关联查询的核心是通过外部表映射能力,将远程服务器的表映射到当前连接的服务器实例中,即可像操作本地表一样写关联查询,不同数据库的实现方式如下:
MySQL环境实现
基于FEDERATED存储引擎实现远程表映射:
- 首先确认你的MySQL实例已开启FEDERATED引擎,执行
show engines;查看FEDERATED行的Support字段为YES即可,未开启则在配置文件中加入federated参数后重启实例。 - 选择任意一个你方便连接的实例(示例选MYPERIOD实例),在ABC schema下创建两张远程映射表,表结构和MYDATETIME实例DEF schema下的对应表完全一致:
-- 映射MYDATETIME的DATE_WEEK表 CREATE TABLE ABC.DATE_WEEK ( -- 此处字段、类型完全和远程DEF.DATE_WEEK一致,示例仅做参考 id INT NOT NULL, time DATETIME, PRIMARY KEY (id) ) ENGINE=FEDERATED CONNECTION='mysql://def_111:def_111@def.111.org:1111/DEF/DATE_WEEK'; -- 映射MYDATETIME的TIME_WEEK表 CREATE TABLE ABC.TIME_WEEK ( -- 此处字段、类型完全和远程DEF.TIME_WEEK一致,示例仅做参考 id INT NOT NULL, date DATETIME, PRIMARY KEY (id) ) ENGINE=FEDERATED CONNECTION='mysql://def_111:def_111@def.111.org:1111/DEF/TIME_WEEK';
- 映射完成后直接执行关联查询即可:
SELECT a.period AS period, c.date AS date, b.time as time FROM ABC.PERIOD_DATE a, ABC.DATE_WEEK b, ABC.TIME_WEEK c -- 请务必补充表之间的关联条件,避免产生笛卡尔积
PostgreSQL环境实现
基于postgres_fdw外部数据包装器实现:
- 启用fdw插件:
CREATE EXTENSION postgres_fdw;
- 配置远程服务器映射:
CREATE SERVER mydatetime_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'def.111.org', port '1111', dbname 'DEF');
- 配置用户权限映射:
CREATE USER MAPPING FOR abc_999 SERVER mydatetime_server OPTIONS (user 'def_111', password 'def_111');
- 导入远程表到当前ABC schema:
IMPORT FOREIGN SCHEMA public FROM SERVER mydatetime_server INTO ABC;
- 直接执行关联查询即可,语法和单库查询完全一致。
通用临时方案
如果你的数据库不支持外部表能力,或者仅需要做一次性查询,可以分别从两个服务器导出所需的表数据到本地临时库,再执行关联查询,无需修改服务器配置。
注意事项
- 跨服务器查询会涉及跨网络数据传输,建议提前加过滤条件缩小数据范围,避免查询性能过低
- 多表关联必须补充合理的关联条件,否则会生成无效的笛卡尔积数据
内容的提问来源于stack exchange,提问作者Shirin
相关产品推荐
相关产品推荐

