前言
最近做一個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