利用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