通过pgloader将SQLite大量数据快速导入PostgreSQL
需求
因为公司最近业务需求,需要一个可管理大量数据的数据库管理系统存储和管理相关数据。选用的PostgreSQL,我自己觉得免费又好看哈哈哈,因为还没正式开始用,使用感受将在后续进行补充。
原数据:SQLite数据,.db
存储方式
现在需要:整个原始数据库导入到PostgreSQL
pgloader
pgloader可以将各种文件数据(如csv、DBF
等),数据库(如SQLite、MySQL
)等导入到PostgreSQL中。据我这两天查询资料发现,pgloader只适用于Linux系统,Windows没查到使用方法。尝试导入的过程中加上pgloader一共试了三种方法,另外两种都是逐行写入(数据量很小可以使用),因为公司的数据量很大,均花费超过半个小时的时间,而使用pgloader整个导入过程只花费了三分钟!!!
官方说明:pgloader
pgloader安装
借鉴网上的方法,最广泛的是使用docker安装(系统:win11
,只记录我的安装过程和问题解决)
docker
下载网址:Docker,在整个过程中,只打开过一次哈哈哈,配好WSL2后就没打开过了,还不太会用,应该是需要拉取镜像的时候就用docker命令在命令行拉取吧?这个后续学习一下,感觉挺有用的。
配置WSL2
刚打开docker时因为没有Linux环境,所以提示安装WSL2,提示教程见配置链接。在教程中我下载的是Ubuntu22.04版本。
获取pgloader
Apt获取(我使用的这个):
打开Ubuntu,输入:sudo apt-get install pgloader
这里我报错了,显示unable to locate package pgloader
,更新apt即可:sudo apt-get update
。
拉取镜像及显示版本等信息:
Docker获取:
docker pull dimitri/pgloader
docker run --rm --name pgloader dimitri/pgloader:latest pgloader --version
docker run --rm --name pgloader dimitri/pgloader:latest pgloader --help
到此为止pgloader就安好啦,最难的也是花我时间最多的就是后面的load过程了。
Load SQLite数据
我的原始数据,和我目标存储位置都在Windows下面,所以难点在于Windows和Ubuntu怎么共享这些文件以及如何远程连接。
编写迁移脚本
命令行输入:vim pgload.load
写入以下数据:(可以参考pgloader官方文档,我写的只是我需要的,后续权限我会用psql添加)
LOAD DATABASE
FROM sqlite:///mnt/winshare/xxx.db
INTO postgresql://postgres:密码@实际ip地址:5432/xxx
with include drop,create tables,create indexes,reset sequences,workers=8,concurrency=1
;
说明:
from
这一行是SQLite数据地址,为了获取到Windows的db文件,我在Windows创建了一个共享文件夹,Ubuntu里也创建了一个对应的文件夹以共享获取到Windows的数据,/mnt/winshare/
就是我Ubuntu里的地址,SQLite数据我放在win的共享文件夹里的。之前其他都设置好了结果显示连接、读取失败(当时两根斜线),后面加了一根斜线就成功了!我感觉是因为这是Ubuntu下的地址,有知道的可以告诉一下我~
Windows共享文件夹设置链接:win11共享文件夹设置
Ubuntu挂载共享文件夹设置链接:Ubuntu挂载共享文件夹into
这一行是postgresql的地址,我是做的远程连接,因为我的postgresql在Windows系统下。其中密码
对应你的postgresql登录密码,实际ip
是我win的IP地址,xxx
是要导入的数据库名称。注意!这个数据库是你已经在postgresql创建好的。with
后面是一些数据库的权限设置,在pgloader官方说明文档里有,对应有不同数据库的语法说明。load database
是不变的,表明你导入的数据是数据库而不是文件。- postgresql中语句一定要用分号结尾!
pgloader执行脚本文件
命令行输入:pgloader pgload.load
中途我报了很多次错误,比如:
- 脚本中with字段出错,这个去找对应的说明或者你不需要就删除就好了,pgloader也会提醒你可能是什么原因;
- from不能访问到我共享的SQLite数据,这个我添加了一个斜线后就成功了,幸运~;
- postgresql连接失败和超时,这个设置了很多,尤其是Windows共享文件夹那里,我的本地账户没有密码,但要远程能访问上是一般需要密码的,所以我找了个解决办法:远程无密码,然后就成功啦。
导入成功
展示一下导入成功的信息哈哈哈哈(骄傲),但这个毕竟是load data,所以数据库中的关系的约束、索引是没有的,目前我还不知道怎么在load的时候将原数据库的配置一起导入:
我用python写入和psql写入均需要半个小时以上哈哈哈,这个环境配好和脚本写好之后只需要三分钟!!!开心开心~
注意:
- Linux命令和Ubuntu环境我都不是很熟(学过但忘记了),术语或者操作有什么不对的地方可以指出来互相学习,友好交流呀~
- 这个只是我自己的记录,因为我看见很少有通过这种方式实现功能哈哈哈,大部分大佬都是直接在Linux环境下操作的,一方面是因为我只是个实习生不敢搞公司电脑,另一方面我确实不知道怎么实现了哈哈哈,有哪里操作有疑问可以提出来大家一起解决,友好交流呀~
- 我想其他数据库类型的转换应该是类似的操作,如果有更方便的方法请务必告诉我!!!虽然我也不一定用上。
- 建立的共享文件夹可以方便其他用户远程存放和读取数据,这样我就可以直接将其导入到PostgreSQL了哈哈哈我是这样想的~
相关参考:
- pgloader 安装 & 使用
- 其他在文中已经引用,感谢~