V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imherer
V2EX  ›  Node.js

mysql 数据导出问题

  •  
  •   imherer · 2018-02-02 11:48:10 +08:00 · 4697 次点击
    这是一个创建于 2517 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 nodejs 实现 总共有 12 个 table,每次导出需要把 12 张表里的部分内容全部导出,导出的数据总共加起来最多几万行左右(应该不超过 5W ) 要求把导出的结果放在 excel 或者.csv 文件里,看了下.csv 好像不支持多个标签 如果放在 excel 里的话可以用一个文件+12 标签搞定(分 12 个文件也没问题),.csv 的话应该只能分 12 个文件了,不过也可以

    现在主要的问题是如何导出:

    1.用户点击了导出按钮,12 张表依次 select 然后保存到 excel,然后再下载(或者全部导出写到一个文件里最后下载,或者 12 个文件打成 zip 再下载)

    2.好像有一个SELECT INTO OUTFILE 的语句,这样的话就是分别导出为 12 个文件最后下载

    不知道各位大佬有没有做过类似的功能,上面 2 种方式哪个效率高,还有别的实现方案吗?

    12 条回复    2018-02-02 17:53:24 +08:00
    liuzuo
        1
    liuzuo  
       2018-02-02 12:25:36 +08:00
    是不是可以使用 mysqldump 导出?
    imherer
        2
    imherer  
    OP
       2018-02-02 12:26:57 +08:00
    mysqldump 能导出为除 sql 以外的格式么?
    fuyufjh
        3
    fuyufjh  
       2018-02-02 12:44:14 +08:00   ❤️ 2
    SELECT INTO OUTFILE 是个反模式,最好不要用。数据库应该只提供数据服务,不应该存储文件。举个例子,万一某天应用服务器和 MySQL 分开部署了呢?

    个人觉得最佳方案是创建一个后台任务,异步执行,成功以后把文件放到指定的位置,把 URL 通知给前端
    wdlth
        4
    wdlth  
       2018-02-02 13:14:53 +08:00 via iPhone   ❤️ 1
    用计划任务比较好,最好是配一个只读从库用于导出操作,不要在线上业务库做。
    panpanpan
        5
    panpanpan  
       2018-02-02 14:27:31 +08:00   ❤️ 1
    mysqldump 效率最高,并且支持 csv,导出之后一封邮件就发出去了
    Cbdy
        6
    Cbdy  
       2018-02-02 14:38:06 +08:00 via Android
    起一个异步任务,导出打包存到 OSS,然后通知后端服务,最近我就这么做了一个功能,Node.js 百来行代码
    eslizn
        7
    eslizn  
       2018-02-02 14:42:00 +08:00   ❤️ 1
    6L 的异步才是正解,不然你数据量大了 web 实时处理必超时
    imherer
        8
    imherer  
    OP
       2018-02-02 14:53:54 +08:00
    @Cbdy 导出用是什么方式呢?
    Cbdy
        9
    Cbdy  
       2018-02-02 15:24:34 +08:00 via Android   ❤️ 1
    @imherer exceljs
    abusizhishen
        10
    abusizhishen  
       2018-02-02 17:22:21 +08:00 via Android
    @fuyufjh 这个方式不错
    qiuleo
        11
    qiuleo  
       2018-02-02 17:40:32 +08:00   ❤️ 1
    生成数据的导出是 nodejs 的问题,跟 Mysql 一点关系都没有。如果说有关系,那就是怎么用 SQL 语句从 mysql 查出来而已,而怎么组装成需要的数据格式,是在 nodejs 里做的。看场景,如果只是一次导出,用 mysql 的 dump 也是可以。
    neocanable
        12
    neocanable  
       2018-02-02 17:53:24 +08:00   ❤️ 1
    第二种明显是不可取的,千万不要用。

    SELECT INTO OUTFILE 要求写入的目录 mysql 至少有写权限,如果你的程序再赋这个目录的权限,到时候你会哭。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1291 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:40 · PVG 01:40 · LAX 09:40 · JFK 12:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.