FDW(Foreign Data Wrapper)
在上一篇博客里,最末尾提到了 FDW。pg 实现了数百个 fdw 插件,用于访问外部数据。
FDW 到底是什么呢?
标准
FDW(Foreign Data Wrapper)遵循了 SQL/MED 标准,标准全称:ISO/IEC 9075-9 Management of External Data (SQL/MED)
2003 年,SQL/MED(SQL Management of External Data)被加入 SQL 标准,其为外部数据管理提供了规范。在 2011 年发行的 PostgreSQL 9.1 开始支持外部数据读,2013 发行的 PostgreSQL 9.3 开始支持外部数据写。
下面两篇 PG wiki 内容介绍得很详细:
- https://wiki.postgresql.org/wiki/SQL/MED
- https://wiki.postgresql.org/wiki/Foreign_data_wrappers
FDW 有何用?
source:https://leileiluoluo.com/posts/postgres-foreign-data-wrappers.html
- 数据分片
使用 FDW 将数据分布式存储在多个数据库上从而实现数据分片(如 pg_shardman 插件,即是使用 postgres_fdw 和 pg_pathman 插件来实现数据分片的)。
- 数据同步
使用 FDW 建立本地数据库与外部数据库的连接,即可定时同步外部数据至本地。
- 数据迁移
使用 FDW 建立本地数据库与外部数据库的连接,即可进行数据迁移。
- ETL(Extract-Transform-Load,抽取转换加载)
使用 FDW 将来自不同类型数据库的数据抽取到一个数据仓库中,便于统一化访问。

PG 实现
pg 实现了数百个 fdw,用于访问外部数据,包括:
- Generic SQL Database Wrappers (如 JDBC、ODBC)
- Specific SQL Database Wrappers(如 MySQL、SQLServer)
- NoSQL Database Wrappers(如 Redis、Cassandra)
- File Wrappers(如 CSV、JSON、Parquet)
- Geo Wrappers
- LDAP Wrappers
- Generic Web Wrappers(如 git、www)
- Specific Web Wrappers
- Big Data Wrappers(如 ES、HDFS、Hive、Arrow)
- Operating System Wrappers
- Exotic Wrappers(如 faker_fdw)
这个页面里,可以找到这些 Wrapper 的源码。
从上面的实现里可以看到,所有 wrapper 的核心,都是实现 FdwRoutine 中的接口。
/** Foreign-data wrapper handler function: return a struct with pointers* to my callback routines.*/
Datum
jdbc_fdw_handler(PG_FUNCTION_ARGS)
{FdwRoutine *fdwroutine = makeNode(FdwRoutine);#if (PG_VERSION_NUM < 90200)fdwroutine->PlanForeignScan = jdbcPlanForeignScan;#endif#if (PG_VERSION_NUM >= 90200)fdwroutine->GetForeignRelSize = jdbcGetForeignRelSize;fdwroutine->GetForeignPaths = jdbcGetForeignPaths;fdwroutine->GetForeignPlan = jdbcGetForeignPlan;#endiffdwroutine->ExplainForeignScan = jdbcExplainForeignScan;fdwroutine->BeginForeignScan = jdbcBeginForeignScan;fdwroutine->IterateForeignScan = jdbcIterateForeignScan;fdwroutine->ReScanForeignScan = jdbcReScanForeignScan;fdwroutine->EndForeignScan = jdbcEndForeignScan;pqsignal(SIGINT, SIGINTInterruptHandler);PG_RETURN_POINTER(fdwroutine);
}
关于 FdwRoutine 中每个接口的含义,可以参考 PG 官网文章:https://www.postgresql.org/docs/current/fdw-callbacks.html
关于 FdwRountine 的更多细节,可以参考专门的文章,十分有趣。如果你希望写一个自己的 wrapper,从 helloworld 入手会非常合适。
思考
PG 真的是一个学院派数据库!在设计之初就能提炼出一个具备进化能力的外部数据接入框架,实在是伟大(实际经历过企业系统研发的人是能体会的)。
FDW 从产品层面的成功之处,是定义好了一套标准的使用接口,包括:定义 FDW Server;定义 FDW 外表,且支持传入选项。
例如:
CREATE SERVER foreign_serverFOREIGN DATA WRAPPER postgres_fdwOPTIONS (host 'localhost', port '5432', dbname 'postgres');CREATE FOREIGN TABLE foreign_weather (city varchar(80),temp_low int,temp_high int,prcp real,date date) SERVER foreign_serverOPTIONS (schema_name 'public', table_name 'weather');IMPORT FOREIGN SCHEMA public FROM SERVER foreign_server INTO public;
有了这套接口,用户就能够非常自由地实现自己的 fdw 扩展。
FDW 从执行层面的成功之处,成功定义了 FdwRoutine 接口,在整个 postgres 实现中贯彻了接口思想,落实在了代码中。
进一步思考
从 FdwRoutine 支持的接口看,并不支持 batch mode,它仅支持火山模型的逐行读取。假设要支持高效的 parquet 文件向量化处理,用 parquet_fdw 插件大约是获取不到最优性能的。
相关文章:
FDW(Foreign Data Wrapper)
在上一篇博客里,最末尾提到了 FDW。pg 实现了数百个 fdw 插件,用于访问外部数据。 FDW 到底是什么呢? 标准 FDW(Foreign Data Wrapper)遵循了 SQL/MED 标准,标准全称:ISO/IEC 9075-9 Managem…...
Flutter开发指南
Flutter开发指南(Android 开发角度) 与Android 的对比 1.Android 的View 与Flutter 的对应关系: a.在android 中,view 是屏幕显示的基础,比如 button,文本,列表,输入框都是 view。…...
SpringCloud学习笔记万字整理(无广版在博客)
在此感谢黑马程序员的SpringCloud课程 所有笔记、生活分享首发于个人博客 想要获得最佳的阅读体验(无广告且清爽),请访问本篇笔记 认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐…...
c++(七)
c(七) 内联函数内联函数的特点为什么要有内联函数内联函数是如何工作的呢 类型转换异常处理智能指针单例模式懒汉模式饿汉模式 VS中数据库的相关配置 内联函数 修饰类的成员函数,关键字:inline inline 返回值类型 函数名(参数列…...
SQL语言
SQL语言 导航 文章目录 SQL语言导航一、SQL概述SQL 二、数据库定义SQL 数据类型 三、数据操作视图更新 四、SQL的授权五、存储过程六、嵌入式SQL主语言与数据库通信 七、动态SQL 一、SQL概述 SQL 支持三级模式结构 视图->外模式 基本表->模式 存储文件->内模式 二…...
【PPT】修改新建文本框默认字体
【PPT】修改新建文本框默认字体...
智能办公本如何选择
智能办公本如何选择 引言 随着科技的不断发展,智能办公本已成为现代职场人士的重要工具。它们不仅具备传统纸质笔记本的书写体验,还融入了先进的智能技术,让办公变得更加高效便捷。在选择智能办公本时,我们需要关注多个方面&…...
Spark基础:Scala变量与数据类型
在Scala中,变量和数据类型是编程的基础。Scala作为一种强大的静态类型语言,支持多种数据类型,并提供了可变(var)和不可变(val)两种类型的变量声明方式。以下是在Scala中变量和数据类型的基础知识…...
php 实现:给图片加文字水印,图片水印,压缩图片
演示环境: 1、windows10 2、phpstudy 3、php7.4 一、案例演示: 二、素材准备 1、准备一张原始图片 2、准备一张水印图片(透明底图的最好) 3、字体库(windows系统自带的字体库,路径在:C:\Window…...
免费实现网站HTTPS访问
HTTPS(Hypertext Transfer Protocol Secure)是一种基于SSL协议的HTTP安全协议,旨在为客户端(浏览器)与服务器之间的通信提供加密通道,确保数据在传输过程中的保密性、完整性和身份验证。与传统的HTTP相比&a…...
vue3使用vue3-print-nb打印
打印效果 1.下载插件 Vue2.0版本安装方法 npm install vue-print-nb --saveVue3.0版本安装方法: npm install vue3-print-nb --save2.main.js引入 vue2引入 import Print from vue-print-nb Vue.use(Print)vue3引入 import print from vue3-print-nb // 打印…...
R语言ggplot2包绘制网络地图
重要提示:数据和代码获取:请查看主页个人信息!!! 载入R包 rm(listls()) pacman::p_load(tidyverse,assertthat,igraph,purrr,ggraph,ggmap) 网络节点和边数据 nodes <- read.csv(nodes.csv, row.names 1) edges…...
php获取今天凌晨零点的时间
不废话直接上代码 //使用strtotime $midnightToday strtotime("today midnight"); //输出:1716998400 //如果是明天 $midnightToday 86400 //后天 $midnightToday 86400*2//ORM中比对使用 $row ModelVisit::where(uid,$this->uid)->where(visi…...
CATIA进阶操作——创成式曲面设计入门(1)线架设计,三维点、直线、平面、曲线
目录 引出三维空间点生成三维直线三维平面三维曲线总结异形弹簧新建几何体草图编辑,画一条样条线进行扫掠,圆心和半径画出曲面上的螺旋线再次选择扫掠,圆心和半径 其他自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自定义信号重…...
thinkphp6中怎么查看ThinkPHP版本号
<?php namespace app\controller; use app\BaseController; use think\app; //这句 class Index extends BaseController { public function test() { echo App::VERSION; //还有这句 } }...
第十二章 创建Web客户端
文章目录 第十二章 创建Web客户端SOAP向导的概述使用SOAP向导 第十二章 创建Web客户端 web客户端是访问web服务的软件。web客户端提供了一组代理方法,每个方法对应于web服务的一个方法。代理方法使用与它所对应的web服务方法相同的签名,并在被请求时调用…...
调试记录-RK平台用指令开启ADB功能
需求 嵌入式Linux系统调试过程中,为了方便,我们会借鉴Android调试的方法,在Linux系统添加adb功能,主要功能是通过USB线连接开发板和PC,实现两者之间传输文件,在PC上执行指令操作开发板。 实现 前提&…...
奇安信_NAC终端安全准入系统(相关问题整理)
奇安信终端安全准入系统 ,下称NAC 一、入网控制方式 1.IP流量控制 2.802.1X 准入 需要NAC、交换机、终端 以802.1X 3.DHCP 准入 将NAC作为DHCP服务器,为客户端分配地址,并对分配地址的客户端进行入网管控。 (*)可选 强制入网…...
在iPhone上恢复已删除的Safari历史记录的最佳方法
您是否正在寻找恢复 iPhone 上已删除的 Safari 历史记录的最佳方法?好吧,这篇文章提供了 4 种在有/无备份的情况下恢复 iPhone 上已删除的 Safari 历史记录的最佳方法。现在按照分步指南进行操作。 iPhone 上的 Safari 历史记录会被永久删除吗࿱…...
【设计模式深度剖析】【7】【结构型】【享元模式】| 以高脚杯重复使用、GUI中的按钮为例说明,并对比Java类库设计加深理解
👈️上一篇:外观模式 | 下一篇:结构型设计模式对比👉️ 设计模式-专栏👈️ 目录 享元模式定义英文原话直译如何理解?字面理解例子:高脚杯的重复使用例子:GUI中的按钮传统方式使用享元模式 4个角色1. …...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
