使用pandas導入csv文件到MySQL


之前嘗試過用命令行來解決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:

  1. https://blog.csdn.net/qq_36523839/article/details/80588092
  2. https://stackoverflow.com/questions/6383310/python-mysqldb-library-not-loaded-libmysqlclient-18-dylib
  3. https://stackoverflow.com/questions/30867390/python-pandas-to-sql-how-to-create-a-table-with-a-primary-key


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM