需求:通過一個多表連接的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()
搞定了。
