前言
最近做一个Django web的项目要把爬取的一些数据存入MySQL中,数据保存为csv格式,想到pandas中有to_sql这个方法,就采用它了
准备:连接MySQL数据库所需的第三方包pymysql、sqlalchemy(pip安装即可)
from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://{}:{}@{}/{}?charset={}".format('用户名', '登录密码', '127.0.0.1:3306', '数据库名','字符编码')) con = engine.connect()#创建连接 df.to_sql(name='rumousdata', con=con, if_exists='append', index=False)
就这么几句,但可能遇到不少问题。我先说下create_engine的url格式吧。用户名、密码不用说,address:port是连接MySQL的ip地址和端口号(默认localhost:3306),数据库名是要连接的数据库,字符编码很重要,要插入中文的话使用utf8
to_sql的几个参数:
- name是表名
- con是连接
- if_exists:表如果存在怎么处理
- append:追加
- replace:删除原表,建立新表再添加
- fail:什么都不干
- index=False:不插入索引index
遇到的坑
看清楚url的格式,很多人到处粘贴,内容是啥都搞不清就用。mysql+pymysql://,像这里我指明通过pymysql这个包来连接数据库,不是MySqldb,当报错ModuleNotFoundError: No module named 'MySQLdb'找不到MySQLdb这个包时就是这个问题
OperationalError: (pymysql.err.OperationalError) (1142, “DROP command denied to user ‘admin’@‘localhost’ for table ‘rumousdata’”)
这个是if_exists=‘replace’,删除表时,用户admin无权限
要么使用root用户,要么申请权限
IntegrityError: (pymysql.err.IntegrityError) (1062, “Duplicate entry ‘1’ for key ‘PRIMARY’”)
这个是主键已存在1,不能重复
中文插入失败
一是、没有指定连接的字符编码utf8,通常可见什么latin1什么什么的无法插入
二是、类似(1366, "Incorrect string value: '\xF0\x9F\x92\x9C\xF0\x9F...' for column 'text' at row,\xF0\x9F\x92\x9C\xF0\x9F,这种原因因为MySQL不识别有些字符的utf8编码(如表情字符),这时你需要指定连接字符编码为utf8mb4。数据表对应字段编码也改成utf8mb4