V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LinkedIn
qq2549112
V2EX  ›  问与答

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

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

    数据库: 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  
       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   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1713 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 17:08 · PVG 01:08 · LAX 10:08 · JFK 13:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.