把pandas的datatable數據自動保存進數據庫的相應的表


需求:通過一個多表連接的sql查詢出的數據,之前是調用pandas把結果保存成excel文件。現在想吧數據保存近數據庫一張字段一樣的表。

我的環境:IDE windows下 pycharm  。python版本 3.6   pandas版本 0.23

1     sql = 'select * from 我的大sql'
2     cursor.execute(sql)
3     results = cursor.fetchall()

這里 results時候sql查詢出的結果。想法是使用pandas的 to_sql 方法把查詢結果插入數據庫。遇到了一些坑。這里,哼哼,把埋坑結果還原一下。

由於調用to_sql需要的數據類型為DataFrame。因此需要首先 把dt轉為df,下邊是我的實現(有更好方法請參考)

1 '''將dt類型轉換成DataFrame類型'''
2 def TableToDataFrame(dt):
3     columnsList = []
4     if len(dt) >0:
5         for item in dt[0]:
6             columnsList.append(item)
7     df = pd.pandas.DataFrame(data = dt,columns = columnsList)
8     return df

這里我們已經拿到了df。繼續往下走,這里就快遇到坑了。之前查的一些用法,發現都是python2.X的。

1 #這里是我最后的成功的用法,給予pandas 0.23版本
2 df.to_sql('你要插入的表',con = irpstdconnection,if_exists='replace',index=False,chunksize=1000)

這里問題又來了。con該怎么寫?我這里是mysql。默認他會是sqllite。於是查官方文檔。

但是看了還是不知道該怎么搞,繼續搜索 找到了例子的部分。找到了以下代碼——我們離目標又近了一步

from sqlalchemy import create_engine

engine = create_engine('postgresql://scott:tiger@localhost:5432/mydatabase')

engine = create_engine('mysql+mysqldb://scott:tiger@localhost/foo')

engine = create_engine('oracle://scott:tiger@127.0.0.1:1521/sidname')

engine = create_engine('mssql+pyodbc://mydsn')

# sqlite://<nohostname>/<path>
# where <path> is relative:
engine = create_engine('sqlite:///foo.db')

# or absolute, starting with a slash:
engine = create_engine('sqlite:////absolute/path/to/foo.db')

當然,mysql的寫法就是我們的需求了。但是問題又來了,

from sqlalchemy import create_engine這里引入需要其他的庫。又報錯了

No module named ‘MySQLdb'”

有事用pycharm去搜索。我勒個去,沒有找到相關信息。立刻感覺不會再愛了(進入死胡同)——這里需要注一下。我是在windows環境下的開發。MySQLdb據說只支持2.X版本。

再搜吧,最后還是讓個找到了方案。詳情見這位小哥的方案。

https://www.cnblogs.com/TaleG/p/6735099.html

解決方案就是 使用PyMsqlDb代替  

然后在需要的項目中,把 __init__.py中添加兩行:
import pymysql
pymysql.install_as_MySQLdb()
就可以用 import MySQLdb了。其他的方法與MySQLdb一樣。

————————————終於解決了,把自己想要的數據 插入了自己想要的表。哦哦
這里總結下:使用pandas的 to_sql con要這樣寫
engine = create_engine('mysql+mysqldb://scott:tiger@localhost/foo')
但是依賴MySQLdb。3.X python 沒有。咋辦
使用pymysql 來替換。並寫上
pymysql.install_as_MySQLdb()
搞定了。
 
        

 


免責聲明!

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



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