需求:通过一个多表连接的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 defTableToDataFrame(dt):3 columnsList =[]4 if len(dt) >0:5 for item indt[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 importcreate_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:///#where 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这里引入需要其他的库。又报错了
有事用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()
搞定了。