1. 程式人生 > >利用pandas的to_sql將資料插入MySQL資料庫和所踩過的坑

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

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/