Pandas 读写 Mysql 主要用到两个函数,下面分析一下 pandas.read_sql() 和 DataFrame.to_sql() 的参数。
read_sql()函数
pandas.read_sql(sql, con, index_col = None, coerce_float = True, params = None, parse_dates = None, columns = None, chunksize)
参数:
●
sql:需要执行的sql语句
●
con:连接数据所需的engine,用其他数据库连接建立,如:
pymysql
●
index_col:选择那列怎为index
●
coerce_float:将数字形字符串转为float
●
params:list,tuple或dict,optional,default:None; 要传递给执行方法的参数列表。
●
parse_dates:将某列日期型字符串转换为datetime型数据
●
columns:选择想要保留的列
●
chunksize:每次输出多少行数据
import MySQLdb
mysql_cn= MySQLdb.connect(host='myhost',
port=3306,user='myusername', passwd='mypassword',
db='information_schema')
df_mysql = pd.read_sql('select * from VIEWS;', con=mysql_cn)
print(len(df_mysql))
mysql_cn.close()
注意点:
1、加入chunksize参数后,返回的df不再是dataframe类型而是一个迭代器,每个分区均为行数1000的dataframe。因此不可直接对df进行dataframe的常规函数操作。
2、数据中有中文的时候数据库engine的charset参数需设置‘utf8’
3、数据中含有decimal类型数据,若不想读取时自动转化为float,一定要带“coerce_float=False”参数,因为默认值时true。楼主在读取数据时发现所有decimal的数据全部变为float类型,整数型多了.0不说,17位的数字变成了科学计数法并丢失了精度。
to_sql()函数
pandas.to_sql(name, con, flavor=None, schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None)
参数:
●
name:SQL 表名
●
con:与数据库链接的⽅式,推荐使⽤sqlalchemy的engine类型
●
schema: 相应数据库的引擎,不设置则使⽤数据库的默认引擎,如mysql中的innodb引擎
ValueError
●
if_exists: 当数据库中已经存在数据表时对数据表的操作,有replace替换、append追加,fail则当表存在时提⽰
●
index:对DataFrame的index索引的处理,为True时索引也将作为数据写⼊数据表
●
index_label:当上⼀个参数index为True时,设置写⼊数据表时index的列名称
●
chunsize:设置整数,如20000,⼀次写⼊数据时的数据⾏数量,当数据量很⼤时,需要设置,否则会链接超时写⼊失败。
●
dtype : 列名到 SQL 类型的字典,默认无
;可选地指定列的数据类型
import pandas as pd
from sqlalchemy import create_engine
conn = create_engine('mysql+mysqldb://root:password@localhost:3306/databasename?charset=utf8')
df = pd.DataFrame()
df["A"] = [1,2,3,4]
df["B"] = [11,22,33,44]
df.to_sql('表名',con=engine,if_exists='replace/append/fail',index=False)
#password 数据库密码
#localhost 数据库ip
#databasename 数据库名
#if_exists='replace/append/fail' 选择其中之一