pandas read_sql 和 to_sql 读写Mysql的参数详解
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 MySQLdbmysql_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' 选择其中之一