数据工程ETL数据集成数据库【免费下载链接】pgloaderMigrate to PostgreSQL in a single command!项目地址https://gitcode.com/gh_mirrors/pg/pgloader点击查看免费下载pgloader 是 PostgreSQL 生态中专注迁移的命令行工具其核心理念是Migrate to PostgreSQL in a single command。本文基于仓库中的 docs/quickstart.rst 编写覆盖最常用的快速路径命令行直接加载 CSV、从标准输入STDIN读取数据、加载 HTTP 远程文件、流式解压远程归档以及 SQLite / MySQL 整库迁移和远程 DBF 归档导入。读完本文你将掌握 pgloader 两种驱动模式中最简单的一种——完全由命令行参数驱动SOURCE TARGET双参数模式并理解每条命令背后的源码实现与适用前提。一、两条使用路径命令文件与命令行直驱pgloader 提供了两种使用方式理解它们的区别是快速上手的关键命令文件.loadpgloader 实现了一套类 SQL 的领域专用语言DSL支持LOAD ... FROM ... INTO ... WITH ...等子句适合复杂场景计算列、数据清洗、BEFORE/AFTER LOAD钩子。语法骨架见 docs/command.rst。命令行直驱当只有一个源和一个目标、且逻辑足够简单时可以直接把信息放在命令行上完全绕过命令文件。从 入口实现 可以看到当命令行参数恰好是两个时2 时pgloader 会调用process-source-and-target把两个参数分别当作SOURCE和TARGET处理而当参数多于两个时则会把第一个参数当作命令文件.load解析。也就是说pgloader [ option ... ] SOURCE TARGET这种恰好两个参数的模式就是快速入门的核心。命令行上没有命令文件因此--type、--field、--with这些开关承担了传递额外信息的工作。二、CSV 文件加载最基础的入门命令最简单的用例是把一个 CSV 文件加载到数据库里已经存在的表中pgloader --type csv \ --field id --field field \ --with truncate \ --with fields terminated by , \ ./test/data/matching-1.csv \ postgres:///pgloader?tablenamematching逐项拆解这条命令--type csv强制指定源类型。命令行模式下 pgloader 需要知道如何解析源--type是可选的Force input source type见 main.lisp 选项定义。CSV 文件没有内建的可探测类型因此通常必须显式给出。--field id --field field声明源文件里每个字段的名字。--field是可重复选项list t每出现一次声明一个字段顺序与文件中的列一一对应。除了--field id --field field这种逐个声明的方式也可以把多个字段名用逗号合并进一个参数如--field usps,geoid,aland,awater。--with truncate加载前对目标表执行TRUNCATE保证目标表从空表开始详见下文WITH 选项速查。--with fields terminated by ,指定 CSV 分隔符为逗号。./test/data/matching-1.csv源文件仓库中真实存在见 test/data/matching-1.csv。postgres:///pgloader?tablenamematching目标连接串。注意表名通过 URI 的tablename参数传递且目标表必须已经存在、结构能与数据匹配。--field与--with的完整语法说明见手册中的 CSV 参考文档。从源码看这条命令最终走的是 src/api.lisp 的process-source-and-target它解析源串、目标串把--with通过parse-cli-options转成选项列表把--field通过parse-cli-fields转成字段定义最后统一调用load-data进入加载流程。这意味着命令行直驱与命令文件两种模式最终汇合到同一套加载管线行为一致。目标表必须预先存在与 SQLite/MySQL 整库迁移不同CSV 加载不会自动建表。手册中给出的配套建表 SQL 如下这是快速入门文档中唯一一段 SQL务必完整保留create table districts_longlat ( usps text, geoid text, aland bigint, awater bigint, aland_sqmi double precision, awater_sqmi double precision, intptlat double precision, intptlong double precision );三、从 STDIN 读取管道与流式处理的基石文件类数据源也可以从标准输入读取把-Unix 惯例中的标准输入作为源参数即可pgloader --type csv \ --field usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong \ --with skip header 1 \ --with fields terminated by \t \ - \ postgresql:///pgloader?districts_longlat \ test/data/2013_Gaz_113CDs_national.txt与上一例的区别-作为源表示标准输入数据由重定向喂给 pgloader。--field一次声明全部 8 个字段用逗号分隔字段名避免多次--field。--with skip header 1跳过文件第一行。该文件第一行通常是列名或版权说明不能当作数据。测试数据 test/data/2013_Gaz_113CDs_national.txt 正是该例的源文件。--with fields terminated by \t分隔符为制表符\t在单引号内表示 Tab。流式加载压缩文件STDIN 模式最大的价值在于与 Unix 管道组合实现边下载边解压边导入gunzip -c source.gz | pgloader --type csv ... - pgsql:///target?foo注意源参数-前的...表示完整的--field/--with参数集实际执行时需按上例补全。操作系统负责网络与命令之间的流式缓冲pgloader 负责把数据流持续灌入 PostgreSQL全程无需落盘整个解压后的文件。四、从 HTTP 加载 CSV远程文件直接导入CSV 文件位于远程 HTTP 地址时pgloader 也能直接处理pgloader --type csv \ --field usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong \ --with skip header 1 \ --with fields terminated by \t \ http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt \ postgresql:///pgloader?districts_longlat这条命令与 STDIN 一节的命令几乎完全相同只是把源从-换成了 HTTP URL。再次强调第一行是表头所以需要skip header 1全部字段合并进单个--field参数声明目标连接串必须带tablename选项目标表必须已存在且能容纳数据即上一节的districts_longlat建表语句。另外文档特别指出同样的命令对同一份数据的归档版本如 .gz同样有效——pgloader 会在本地先抓取 HTTP 内容识别出归档格式并解压然后处理解压后的本地文件。归档处理的实现细节HTTP 抓取与解压的逻辑集中在 src/utils/archive.lisphttp-fetch-file负责把远程文件下载到本地临时目录*default-tmpdir*支持归档类型由*supported-archive-types*定义为:tar :tgz :gz :zip四种archive-type依据文件扩展名判定类型expand-archive分别调用untar/gunzip/unzip解压。因此下载 → 解压 → 打开 → 发现 schema → 加载数据是 pgloader 对远程归档的默认完整流程。五、流式解压远程压缩 CSVcurl gunzip pgloader当你的归档格式 pgloader 不支持或环境中无法展开归档时可以用经典管道把内容直接流式送入 PostgreSQLcurl http://pgsql.tapoueh.org/temp/2013_Gaz_113CDs_national.txt.gz \ | gunzip -c \ | pgloader --type csv \ --field usps,geoid,aland,awater,aland_sqmi,awater_sqmi,intptlat,intptlong \ --with skip header 1 \ --with fields terminated by \t \ - \ postgresql:///pgloader?districts_longlat这里curl从远程拉取 .gz 归档gunzip -c就地解压并输出到 stdoutpgloader ... -从标准输入消费数据。OS 负责网络与命令进程间的流式缓冲pgloader 则持续把数据流式写入 PostgreSQL。相比上一节的先抓取再解压再处理这种方式节省了中间落盘步骤是处理大规模远程归档的推荐手法。六、SQLite 整库迁移schema 自动发现与类型转换SQLite 迁移只需两条命令createdb newdb pgloader ./test/sqlite/sqlite.db postgresql:///newdbpgloader会打开 SQLite 数据库自动发现其表结构、索引与外键把这些定义**cast转换**为 PostgreSQL 等价类型后迁移过来随后迁移数据。仓库中test/sqlite/下提供了真实可用的样例库如 test/sqlite/sqlite.db、Chinook 样例可以拿来直接体验。源码佐证SQLite 的 schema 探测走 src/sources/sqlite/sqlite-schema.lisp其 introspection 依赖仓库内置的 PRAGMA 查询脚本包括PRAGMA foreign_key_listlist-fkeys.sql、PRAGMA index_listlist-table-indexes.sql、PRAGMA index_infolist-index-cols.sql等类型转换规则由 src/sources/sqlite/sqlite-cast-rules.lisp 定义未显式声明的自增主键索引也会被补全add-unlisted-primary-key-index见 sqlite-schema.lisp。与 CSV 不同SQLite/MySQL 迁移时源是数据库而非文件pgloader 能自行探测 schema因此不需要--type也不需要预先建表。七、MySQL 整库迁移一行命令完成MySQL 迁移同样是一条命令的事createdb pagila pgloader mysql://userlocalhost/sakila postgresql:///pagilapgloader 连接 MySQL 的 sakila 库自动迁移其表结构含索引、外键、视图等可迁移对象、cast 数据类型并搬运数据。仓库中提供了完整可复现的测试场景例如 tests/mysql/sakila 与 test/mysql 目录下的.load与.sql文件。实现要点MySQL 侧的类型转换规则见 src/sources/mysql/mysql-cast-rules.lisp连接与 schema 探测在 src/sources/mysql/mysql-connection.lisp 与 src/sources/mysql/mysql-schema.lisp 中源类型到加载代码的分派表定义于 src/api.lisp。八、远程 DBF 归档下载 → 解压 → 探测 → 导入最后一个快速用例是 DBFdBase文件。pgloader 可以从 HTTP 下载归档、解压、打开并探测 schema然后加载数据createdb foo pgloader --type dbf http://www.insee.fr/fr/methodes/nomenclatures/cog/telechargement/2013/dbf/historiq2013.zip postgresql:///foo这里必须使用--type dbf与 CSV 类似pgloader 无法从给定的 HTTP URL 猜出数据源类型因此需要命令行开关显式指定。仓库中的 DBF 测试数据与用例见 tests/dbf含 dbf-31、dbf-8b、dbf-memo、reg2013 等场景。九、WITH 选项速查快速路径可用的常用开关命令行直驱模式下--with是可重复的Load optionsmain.lisp其解析器会把它映射为与命令文件WITH子句等价的选项。从 CSV 参考文档 与 CSV 解析器实现 可以确认快速入门中最常用的包括选项作用truncate加载前对目标表执行TRUNCATE清空旧数据skip header N跳过输入文件开头的 N 行表头/版权行csv header把跳过表头后的第一行当作 CSV 字段名列表fields terminated by X设置字段分隔符支持普通字符、\t、0xNN十六进制形式lines terminated by X设置行结束符fields optionally enclosed by X设置引用/包围字符默认双引号如\或0x27fields not enclosed字段不加引号双引号按普通字符处理fields escaped by backslash-quote设置转义字符csv escape mode quote / following控制转义解析模式默认quotetrim unquoted blanks/keep unquoted blanks是否裁掉未加引号字段两侧的空白默认裁剪date format ...为日期/时间类型列统一指定解析模板on error stop/on error resume next出错即停 / 出错继续batch rows R、batch size ... MB、prefetch rows ...批量行为控制workers W、concurrency C、max parallel create index I并行度控制分隔符与引号字符的解析规则在 command-csv.lisp 中有精确定义支持\t表示制表符、\表示反斜杠、0x加两位十六进制表示 ASCII 码以及单引号转义写法。十、命令行直驱的适用边界与注意事项综合源码与文档使用快速路径时请注意以下几点只有恰好两个位置参数时才会走SOURCE TARGET快速模式否则第一个参数会被当作 .load 命令文件解析main.lisp。--type的适用性CSV、DBF 等文件型源通常必须显式--typeSQLite/MySQL 这类数据库源可自动识别。目标表存在性CSV 加载要求目标表已存在且结构匹配SQLite/MySQL 迁移则由 pgloader 自动建表。表名传递文件型源的目标表名通过 PostgreSQL 连接串的tablename参数指定可以带 schema 前缀如?tablenamegeolite.blocks。当命令行参数与命令文件混用时--type、--with、--field等选项在加载 .load 文件时会被忽略并给出提示main.lisp所以不要混用两种模式。快速路径背后的统一入口load-datasrc/api.lisp会把命令行解析结果编译为加载代码并执行从 api.lisp 的分派表 可见csv、fixed、dbf、ixf、sqlite、mysql、mssql、pgsql 各源类型均有对应的加载代码生成函数——这意味着你在快速入门中学会的命令行直驱模式可以平滑延伸到这些源类型。更复杂的场景计算列、USING投影、BEFORE/AFTER LOAD钩子则可以转向 docs/ref/csv.rst、docs/ref/sqlite.rst、docs/ref/mysql.rst 等参考文档学习完整的 pgloader 命令语法。赞分享数据工程ETL数据集成数据库【免费下载链接】pgloaderMigrate to PostgreSQL in a single command!项目地址https://gitcode.com/gh_mirrors/pg/pgloader点击查看免费下载相关推荐pgloader 官方教程全解从 CSV、定宽文件到 SQLite/MySQL 的一站式 PostgreSQL 迁移实战pgloader 官方教程全解从 CSV、定宽文件到 SQLite/MySQL 的一站式 PostgreSQL 迁移实战 本文以仓库内 docs/tutori数据工程ETL数据集成数据库如何用 Freqtrade convert-db 命令把 SQLite 数据库迁移到 PostgreSQL如何用 Freqtrade convert db 命令把 SQLite 数据库迁移到 PostgreSQL Freqtrade 在 Live 和 Dry Ru金融科技后端机器学习如何用pgloader快速实现MySQL到PostgreSQL的完整迁移如何用pgloader快速实现MySQL到PostgreSQL的完整迁移 还在为数据库迁移而烦恼吗pgloader作为一款强大的数据加载工具能够帮你轻数据工程ETL数据集成数据库上一篇如何在24小时内构建企业级数据可视化平台下一篇Nuxt项目中使用vite-plugin-vue-inspector的完整教程与最佳实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?