请问 sqlalchemy 用什么算法从数据库获取大量数据,且不浪费性能啊 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qq2549112
V2EX    问与答

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

  •  
  •   qq2549112 2015-07-03 14:18:45 +08:00 5637 次点击
    这是一个创建于 3830 天前的主题,其中的信息可能已经有所发展或是发生改变。

    数据库: mysql
    数据量:20W

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

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

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

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

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

    嘿嘿

    第 1 条附言    2015-07-03 14:56:29 +08:00
    谢谢大家
    我可能表达的有点模糊


    现在 难住我的 并非 如何插入pg

    而是, 如何把20w数据 取出来

    目前我是一次性把20w获取出来,但是很卡

    我知道必须要写成 limit 形式, 分页获取

    这个分页算法,我不知道如何写

    我就是像和大家咨询下 请教下 分页算法


    感谢 所有回答我的朋友们 谢谢
    第 2 条附言    2015-07-03 14:59:22 +08:00
    最终,我像实现的功能

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

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

    2. 实时增量同步


    目前,我要先实现第一步, 就遇到了分页问题

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

    最终,我想实现的功能

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

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

    2. 实时增量同步

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


    谢谢
    qq2549112
        13
    qq2549112  
    OP
       2015-07-03 15:12:30 +08:00
    @qq2549112 谢谢你,刚才我研究了下,发现dblink不行 ,因为 mysql在内网, postgresql 在外网,他们2个之间 无法互相访问, 我有个主机可以访问他们2个, 可能还是要用 python脚本来弄
    clino
        15
    clino  
       2015-07-03 16:57:07 +08:00
    我觉得楼主要先弄清楚是读慢还是写慢,我估计读不会慢,如果写慢要用事务,用单个事务批量写才能快
    realityone
        16
    realityone  
       2015-07-03 17:32:14 +08:00
    其实可以参考 flask-sqlalchemy 里面的 Pagination 的实现
    ksupertu
        17
    ksupertu  
       2015-07-03 17:33:25 +08:00
    20万数据用kettle可以搞定,有mysql bulk load功能,图形化配置,酸爽无比,前提你的linux有图形界面,配置好之后可以用脚本去跑,数据量更大的话我是用python的pandas库来实现的,但是当有重复数据的时候插入的很慢很慢,600万条我跑了三天了,也许是代码写的渣渣吧……mysql blob字段插入的时候慢成狗了,似乎每次都要全表扫描一次,优化了下还是慢成狗……
    zhouquanbest
        18
    zhouquanbest  
       2015-07-03 18:14:09 +08:00
    20w真心少
    我觉得LZ是写法有问题
    和Sqlalchemy没什么关系
    qq2549112
        19
    qq2549112  
    OP
       2015-07-04 11:14:06 +08:00
    感谢楼上各位
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2075 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 00:41 PVG 08:41 LAX 16:41 JFK 19:41
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86