利用pandas的to_sql将数据插入MySQL数据库和所踩过的坑


前言

最近做一个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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM