python pandas dataframe to_sql方法error及其解決


  今天遇到了一個問題,很是奇怪,自己也想了一個另類的方法將其解決了,現在將詳細過程經過記錄如下:

  我在處理完一個dataframe之后,需要將其寫回到數據庫。這個dataframe比較大,共有53列,72609行,使用下述代碼嘗試將其寫入mysql數據庫。

pd.io.sql.to_sql(df,'xxx',zh_con,flavor='mysql',if_exists='append',index=False)

  然后就報錯了,錯誤如下:

Traceback (most recent call last):
  File "/home/fit/PycharmProjects/Decision_Tree_Rough_sets_theory/main/handle_data.py", line 33, in <module>
    pd.io.sql.to_sql(df,'A_stock_quarter_total',zh_con,flavor='mysql',if_exists='append',index=False)
  File "/home/fit/.pyenv/versions/2.7.11/lib/python2.7/site-packages/pandas/io/sql.py", line 569, in to_sql
    chunksize=chunksize, dtype=dtype)
  File "/home/fit/.pyenv/versions/2.7.11/lib/python2.7/site-packages/pandas/io/sql.py", line 1634, in to_sql
    table.insert(chunksize)
  File "/home/fit/.pyenv/versions/2.7.11/lib/python2.7/site-packages/pandas/io/sql.py", line 765, in insert
    self._execute_insert(conn, keys, chunk_iter)
  File "/home/fit/.pyenv/versions/2.7.11/lib/python2.7/contextlib.py", line 35, in __exit__
    self.gen.throw(type, value, traceback)
  File "/home/fit/.pyenv/versions/2.7.11/lib/python2.7/site-packages/pandas/io/sql.py", line 1525, in run_transaction
    self.con.rollback()
_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')

  在互聯網上沒有找到任何解決方法,嘗試將dataframe行數縮減,成功的寫入了數據庫。於是我想到利用循環分批次將數據寫入數據庫,如下:

l=0
r=100
length =len(df)
while(l<length):
    pd.io.sql.to_sql(df[l:r],'xxx',my_con,flavor='mysql',if_exists='append',index=False)
    l+=100
    r+=100

  問題成功解決!就是暫時不知道真實的錯誤原因,需要進一步探討。

  今天再次遇到這個問題,google了一下,在stackoverflow上面找到了答案.可以通過指定chunksize參數的方式來進行大批量插入,pandas會自動將數據拆分成chunksize大小的數據塊進行批量插入,其實原理類似於我在上面使用的循環插入法.在不指定這個參數的時候,pandas會一次性插入dataframe中的所有記錄,mysql如果服務器不能響應這么大數據量的插入,就會出現上述錯誤.附上正確的插入姿勢:

pd.io.sql.to_sql(df,'xxx',zh_con,flavor='mysql',if_exists='append',index=False,chunksize=10000)
#此處的chunksize可以自定義

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM