之前嘗試過用命令行來解決csv文件導入到MySQL這個問題,沒想到一直沒有成功。之后會繼續更新的吧,現在先用pandas來解決這個問題,雖然會復雜一點,但至少能用。
例子是導入movielens的rating數據,如下:
1. 創建表格
CREATE TABLE ratings(
id BIGINT NOT NULL AUTO_INCREMENT,
userId BIGINT NOT NULL,
movieId BIGINT NOT NULL,
rating DOUBLE NOT NULL,
timestamp BIGINT NOT NULL,
PRIMARY KEY(id)
);
2. pandas 操作
下列操作如遇到no module,請自行用pip
進行下載😄。
2.1. 創建與數據庫的連接
from sqlalchemy import create_engine
engine = create_engine('mysql+mysqldb://root:password@localhost:3306/test?charset=utf8')
#format: create_engine(mysql+mysqldb://用戶名:密碼@localhost:端口/數據庫名?編碼)
上面的操作可能會遇到這個問題:
Traceback (most recent call last):
...
...
ImportError: dlopen(/Users/wooka/anaconda3/lib/python3.6/site-packages/_mysql.cpython-36m-darwin.so, 2): Library not loaded: @rpath/libmysqlclient.21.dylib
Referenced from: /Users/wooka/anaconda3/lib/python3.6/site-packages/_mysql.cpython-36m-darwin.so
Reason: image not found
雖然沒太弄懂是原因,但是應該是導入錯誤。嘗試了一些方法,直接提供可行的解決方法:
原文是創建一個symbolic link,命令行如下,具體可見注釋2:(將libmysqlclient.21.dylib 的版本改為自己的版本號)
sudo ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/lib/libmysqlclient.21.dylib
2.2 導入csv為DataFrame
import pandas as pd
data = pd.read_csv('~/Desktop/ratings.csv', encoding='utf-8')
2.3 導出到MySQL
data.to_sql('ratings', con=engine, if_exists='append', index_label='id')
哈哈,我發現這樣有錯誤:
sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1062, "Duplicate entry '1' for key 'PRIMARY'") [SQL: 'INSERT INTO ratings (id, `userId`, `movieId`, rating, timestamp)...
之前在數據庫中創建表格的時候定義了主鍵id,且自動遞增,而主鍵的index應該從1開始。然而這里的index_label明顯是從0開始的,所以會產生這樣的錯誤。
其實看了一些方法,有定義函數,有先創建表格后定義主鍵的。但是,這樣最簡便:
data.to_sql(con=engine, name='ratings', if_exists='replace', flavor='mysql', index=False)
with engine.connect() as con:
con.execute('ALTER TABLE `ratings` ADD PRIMARY KEY (`id`);')
Reference: