python 导入csv 到mysql_使用pandas导入csv文件到MySQL

之前尝试过用命令行来解决csv文件导入到MySQL这个问题,没想到一直没有成功。之后会继续更新的吧,现在先用pandas来解决这个问题,虽然会复杂一点,但至少能用。

例子是导入movielens的rating数据,如下:

1389398-20190110162505283-1038737370.png

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:

你可能感兴趣的:(python,导入csv,到mysql)