那些年我们在python掉进的坑系列之一pandas的to_sql
那些年我们在python掉进的坑系列之一pandas的to_sql。在目前大数据和人工智能的大趋势下,越来越多的人开始学习python作为自己入手数据和ai的第一门语言,笔者也是如此。很多人在接触python的第一步都是学习pandas,主要是这个框架是最接近于r和matlab学习起来轻松易懂。但是在pandas的使用中,有很多问题和很多人因为对和计算机概念不理解,导致很多很多的坑,笔者在此开一个系列博文,不定期更新中会将自己遇到的坑介绍给大家。
pandas坑之to_sql
pandas是将格式化数据直接编程python可读的dataframe格式(其实本质上就是字典,并且自动设置了index和colunms),pandas本身的操作给了用户很好的体验和数据分析过程,但是pandas从读取再转录入数据库是不少新人一直头疼的问题,笔者也为此最初头疼不已。根据《利用python进行数据分析》的书中,有大致介绍一个函数——to_sql,相信很多人都是对此了解的。
但是,使用to_sql这个函数有一个问题,虽然to_sql函数可以直接将字典数据直接存入数据库,但是,to_sql限制是非常之大的(毕竟别人写的类)
我们先看一个操作
import pandas as pd
import pymysql
conn=pymysql.connect(host,port,user,password,charset,db)
df1=pd.dataframe(list)
df.to_sql(tablename,conn)
相信很多人都是按照以上进行的傻瓜操作,但是笔者在这里只能告诉你们,这是大错特错的。
要学习python最快的方法,并不是上什么班,看视频,最快的方法,就是去python的库文档,python手册。毕竟python虽然在使用上非常难,但是在学习上并不是特别难(相对于java和c++)。
根据库的文档,我们看到to_sql函数支持两类mysql引擎一个是sqlalchemy,另一个是sqlliet3.没错,在你写入库的时候,pymysql是不能用的!!!mysqldb也是不能用的,你只能使用sqlalchemy或者sqlliet3!!鉴于sqllift3已经很久没有更新了,笔者这里建议使用sqlalchemy!!
所以上面那段要改写成下面这样:
import pandas as pd
from sqlalchemy import create_engine
conn = create_engine('mysql+mysqldb://root:password@localhost:3306/databasename?charset=utf8')
下面一步很关键,注意!!!to_sql函数并不在pd之中,而是在io.sql之中,是sql脚本下的一个类!!!所以to_sql的最好写法就是:
pd.io.sql.to_sql(df1,tablename,con=conn,if_exists='repalce')
是不是感觉大功告成了???
那是你的错觉,赶紧回到数据库看看吧!!你会发现wtf为什么我原来的数据都没有了!!
这就是to_sql的第二个坑if_exists字段:
很多新人按照网上的教程,都将if_exists字段定义为‘replace’活着‘fail’,要么发现原来数据没有了,要么发现什么时候都没有做!
麻烦请各位新人仔细阅读文档!!!
fail的意思如果表存在,啥也不做
replace的意思,如果表存在,删了表,再建立一个新表,把数据插入
append的意思,如果表存在,把数据插入,如果表不存在创建一个表!!
你看懂了吗,所以大家一定要读文档!读文档!!读文档!!!