Life is fantastic

Life

导入csv文件到docker容器中的MySQL

62
2021-05-23
1. 问题概述

最近需要导入大批量的Excel表格数据到MySQL中,为了方便,直接将Excel文件保存为UTF-8编码的csv文件,采用逗号分割,使用MySQL的LOAD DATA INFILE命令去实现这一功能。

2. 解决方案

首先设置好docker中的MySQL配置文件允许导出导入的目录权限

由于我这里的MySQL是之前就启动的容器里的,所以我为了方便,直接进到容器中去修改相关配置

  • 使用命令docker exec -it 你的容器名或ID /bin/bash进入容器中

  • 找到docker的安装目录,我这里是使用whereis mysql的命令找到了相应的安装目录在/etc/mysql中,这时候另一个难题来了,众所周知,docker容器为了精简化,删除掉很多诸如vi/vim的文件编辑器,这里我只能使用cat EOF来修改配置文件的内容。

    cat my.cnf
    cp my.cnf my1.cnf
    cat>my1.cnf<

    将修改后的文件内容粘贴到终端中(这里要把secure_file_priv的值删除掉,也就是=号后边的NULL删除)结尾加上EOF结束文件编辑。重启容器。这时候再进到MySQL中SHOW VARIABLES LIKE "secure_file_priv";发现VALUE已经不再是NULL了,这里解释一下这个变量的区别

    • NULL,表示禁止。
    • 如果value值有文件夹目录,则表示只允许该目录下文件(PS:测试子目录也不行)。
    • 如果为空,则表示不限制目录。

设置启用MySQL的加载本地数据的功能

  • 使用终端mysql --local-infile=1 -h172.111.111.111 -u root -p123456 -P 2220登录到docker中的MySQL中

  • 查看是否开启加载本地文件show variables like 'local_infile';

  • 如果查询到的value值为OFF则开启全局本地文件设置set global set local_infile=on;

3. 导入数据
  • 在终端中输入以下类似命令

    LOAD DATA local INFILE 'C:\Users\Administrator\Desktop\pingan.csv' INTO TABLE baoxian FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES

    运行即可导入CSV中的数据

    Enjoy!

4. SQL语句语法解释
  • LOAD DATA INFILE 加载文件‘D:\tmcsv\sblc_45.csv’ 文件目录路径
  • FIELDS TERMINATED BY ‘,’ 指定字段分隔符
  • INTO TABLE tm_process : 插入+表名
  • OPTIONALLY ENCLOSED BY ‘\"’ 认为双引号中的是一个独立的字段。Excel 转 CSV 时,有特殊字符(逗号、顿号等)的字段,会自动用双引号引起来。
  • LINES TERMINATED BY ‘\n’ 指定行分隔符,注意,在 Windows 平台上创建的文件,分隔符是 ‘\r\n’
  • IGNORE 1 LINES:忽略第一行,第一行是字段名的可以加 ( reg_no, class_id, apply_title, apply_status, date, apply_no) 对应的表字段名然后,创建数据表tm_process,根据csv的字段自己创建。
  • 0