

先简单放一下用到的:
MYSQL : 5.6版本
python3
powershell。
将csv导入mysql,主要就是用mysql的load data功能实现,其他前辈也都讲得很清楚了,这里简单列一下语句(注意enclosed只有一个双引号,此外‘忽略’那里,rows表示的是列,lines表示的是行,这里略去首行):
load data local infile 'filepath' into table tablename fields terminated ',' enclosed by '"' lines terminated by '\n' ignore 1 lines:
local关键字声明是从客户端传来服务器,即使文件在本地也可以用,就是速度会慢一些。而如果文件在本地且不用local关键字,那么需要把文件放在Mysql的Data文件夹下,查看Mysql的data文件夹:
show variables like 'datadir'
然后就是批量的实现了,由于掉了好几次坑,所以我用了两种办法来实现,一个用python3,另一个用Powershell的脚本
不知道为什么windows上的MySQLdb支持不了python3(Linux的可以),于是换了pymysql,用了local关键字导入了第一批数据,没有问题,就是速度比较慢,感觉每秒1M多吧。
为了提高速度,就想去掉LOCAL,于是把第二批数据拷贝到了data文件夹下,结果不知道是数据的问题还是mysql的问题,出现数据类型不匹配报错:
1366 : incorrect decimal value: '' for column 'column_name' in row 1
但神奇的是我的数据文件里并没有空值......而且如果不用python,而是直接用mysql执行sql语句,数据能顺利导入。于是菜鸟我以为是pymysql出了什么问题,就计划用别的方法,搜索了一下想用脚本,刚好windows上有powershell,感觉上手还挺方便,就用了它。
最早的时候,想直接用命令行方式:mysql -uuser -ppwd -e"SQL", 但这种方式里-e后接的sql不能是变量,即使是两个字符串拼接起来也不行。所以只好用其他方法,查询到可以用.net框架连接操作mysql,于是就按http://www.xuebuyuan.com/441945.html里的方法(原谅我没加上链接,但不知道为什么一加编辑页面就崩溃),不过由于我个人只需要创建表和插入数据的操作,并不需要获取数据,所以构建好command后,用
$command.ExecuteNonQuery();
直接执行即可。
然而悲催的是,在顺利load了十来个数据文件后,它又报错了!还是原来的错误1366!
这下我是真得想不出原因会在哪里了,只好按最早查到的解决方案,将mysql的配置文件my.ini里的sql-mode
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
改成
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
然后数据就顺利导入了。
然而我还是不知道前面为什么会报错,而且有时报错有时正常?如果有大佬看到这篇文章并愿意解答的话,非常感谢!
扫一扫在手机打开