请问 sqlalchemy 用什么算法从数据库获取大量数据,且不浪费性能啊

2015-07-03 14:18:45 +08:00
 qq2549112

数据库: mysql
数据量:20W

打算用 sqlalchemy 来把里面的数据 下载到本地的另外一个 postgresql数据库里面

思路是,sqlalchemy 去mysql获取数据,然后直接插入本地的postgresql里面

我目前的方法是 session.query(User1).all() 然后for ,然后插入本地数据库,但是好卡 好卡的

我知道 我还 可以先获取 总数据量,然后 limit 分页 来获取数据

我想请问下,有没有实现这样功能的轮子呀

嘿嘿

5132 次点击
所在节点    问与答
19 条回复
clijiac
2015-07-03 14:24:06 +08:00
不能导出成sql 然后再导入么~
写代码的话 也有batch insert的吧 随便搜了下 看看这个http://stackoverflow.com/questions/758945/whats-the-fastest-way-to-do-a-bulk-insert-into-postgres
sivacohan
2015-07-03 14:28:44 +08:00
@clijiac 他的难点应该是mysql到pg。不排除他使用了什么奇特的数据类型。
clijiac
2015-07-03 14:34:01 +08:00
脑子一拍 navicat的datatransfer可不可以支持啊..哈哈哈
Septembers
2015-07-03 14:36:55 +08:00
@sivacohan 比如PgSQL VARCHAR不容忍\0字符
qq2549112
2015-07-03 14:44:32 +08:00
@clijiac
@sivacohan
@Septembers
谢谢 难点不是 怎么插入到pg ,而是 怎么把数据库取出来,主要是数据量大,如果只有几百个记录,我直接 all 就可以了, 但这里面有20w 不能用all
whatot
2015-07-03 14:47:13 +08:00
试试postgresql的dblink,外部表
qq2549112
2015-07-03 14:51:42 +08:00
@whatot 谢谢 如果用dblink 还能用postgresql 的jsonb 特性吗
Septembers
2015-07-03 14:52:55 +08:00
@qq2549112 可以转换成CSV格式 然后在PgSQL里执行copy导入
see http://www.postgresql.org/docs/9.5/static/sql-copy.html
whatot
2015-07-03 14:55:25 +08:00
@qq2549112 dblink之后,转换成jsonb就行了,20w数据量很小的
qq2549112
2015-07-03 14:57:55 +08:00
@whatot 哦哦 我研究下这个东西,dblink 我目前理解 好像是 快捷方式的意思, 那数据还是在远程mysql里面吗, 是不是我查询的时候,他才去转换为jsonb哦,如此的话 那每次查询会浪费好多性能,要好多时间哦, 我再研究下 dblink看看,我还是第一次接触这个东西 嘿嘿 谢谢
whatot
2015-07-03 14:58:12 +08:00
@qq2549112 如果数据只是一次转移,推荐先从mysql导出数据,之后使用copy导入到postgresql。
如果是长期任务,那可以试试dblink。
qq2549112
2015-07-03 15:00:10 +08:00
@whatot 就是长期的

最终,我想实现的功能

就是让 pg 里面的数据 和mysql 保持一致

1. 先把历史数据拷贝过来 ,数据量20w

2. 实时增量同步

目前,我要先实现第一步, 就遇到了分页问题 [ 也就是现在发帖求助的问题]


谢谢
qq2549112
2015-07-03 15:12:30 +08:00
@qq2549112 谢谢你,刚才我研究了下,发现dblink不行 ,因为 mysql在内网, postgresql 在外网,他们2个之间 无法互相访问, 我有个主机可以访问他们2个, 可能还是要用 python脚本来弄
clijiac
2015-07-03 16:17:29 +08:00
clino
2015-07-03 16:57:07 +08:00
我觉得楼主要先弄清楚是读慢还是写慢,我估计读不会慢,如果写慢要用事务,用单个事务批量写才能快
realityone
2015-07-03 17:32:14 +08:00
其实可以参考 flask-sqlalchemy 里面的 Pagination 的实现
ksupertu
2015-07-03 17:33:25 +08:00
20万数据用kettle可以搞定,有mysql bulk load功能,图形化配置,酸爽无比,前提你的linux有图形界面,配置好之后可以用脚本去跑,数据量更大的话我是用python的pandas库来实现的,但是当有重复数据的时候插入的很慢很慢,600万条我跑了三天了,也许是代码写的渣渣吧……mysql blob字段插入的时候慢成狗了,似乎每次都要全表扫描一次,优化了下还是慢成狗……
zhouquanbest
2015-07-03 18:14:09 +08:00
20w真心少
我觉得LZ是写法有问题
和Sqlalchemy没什么关系
qq2549112
2015-07-04 11:14:06 +08:00
感谢楼上各位

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/203065

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX