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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzw2016/article/details/84720433

前言

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

If you are running MySQL before 5.5.3, you have only ‘utf8’. If you need Emoji or Chinese, then you need ‘utf8mb4’. The advice in this section assumes you will be going to utf8mb4. If you are going only to utf8, adjust accordingly.
还有一些python对mysql数据库操作、连接可能遇到的问题也可在这里找到:http://mysql.rjweb.org/doc.php/charcoll#python

在这里插入图片描述


版权声明:本文为博主原创文章,未经博主允许不得转载。
Josonle’s Blog
https://blog.csdn.net/lzw2016/


猜你喜欢

转载自blog.csdn.net/lzw2016/article/details/84720433