先簡單放一下用到的: MYSQL : 5.6版本 python3 powershell。 將csv導入mysql,主要就是用mysql的load data功能實現,其他前輩也都講得很清楚了,這裡簡單列一下語句(註意enclosed只有一個雙引號,此外‘忽略’那裡,rows表示的是列,lines表示的 ...
先簡單放一下用到的:
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"
然後數據就順利導入了。
然而我還是不知道前面為什麼會報錯,而且有時報錯有時正常?如果有大佬看到這篇文章並願意解答的話,非常感謝!