那些年我们在python掉进的坑系列之一pandas的to_sql

时间:2021-08-03 15:49:23

在目前大数据和人工智能的大趋势下,越来越多的人开始学习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的意思,如果表存在,把数据插入,如果表不存在创建一个表!!


你看懂了吗,所以大家一定要读文档!读文档!!读文档!!!