Python的pandas包对表格化的数据处理能力很强,而SQL数据库的数据就是以表格的形式储存,所以常常将sql数据库里的数据直接读取为dataframe,分析操做之后再将dataframe存到sql数据库中。而pandas中的read_sql和to_sql函数就能够很方便得从sql数据库中读写数据。html
参见pandas.read_sql的文档,read_sql主要有以下几个参数:python
import pandas as pd import pymysql import sqlalchemy from sqlalchemy import create_engine # 1. 用sqlalchemy构建数据库连接engine connect_info = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE) #1 engine = create_engine(connect_info) # sql 命令 sql_cmd = "SELECT * FROM table" df = pd.read_sql(sql=sql_cmd, con=engine) # 2. 用DBAPI构建数据库连接engine con = pymysql.connect(host=localhost, user=username, password=password, database=dbname, charset='utf8', use_unicode=True) df = pd.read_sql(sql_cmd, con)
解释一下 #1: 这个是sqlalchemy中连接数据库的URL格式:dialect[+driver]://user:password@host/dbname[?key=value..]
。dialect表明书库局类型,好比mysql, oracle, postgresql。driver表明DBAPI的名字,好比psycopg2,pymysql等。具体说明能够参考这里。此外因为数据里面有中文的时候就须要将charset设为utf8。mysql
参见pandas.to_sql函数,主要有如下几个参数:sql
df.to_sql(name='table', con=con, if_exists='append', index=False, dtype={'col1':sqlalchemy.types.INTEGER(), 'col2':sqlalchemy.types.NVARCHAR(length=255), 'col_time':sqlalchemy.DateTime(), 'col_bool':sqlalchemy.types.Boolean })
注:若是不提供dtype,to_sql会自动根据df列的dtype选择默认的数据类型输出,好比字符型会以sqlalchemy.types.TEXT类型输出,相比NVARCHAR,TEXT类型的数据所占的空间更大,因此通常会指定输出为NVARCHAR;而若是df的列的类型为np.int64时,将会致使没法识别并转换成INTEGER型,须要事先转换成int类型(用map,apply函数能够方便的转换)。数据库
参考:
http://docs.sqlalchemy.org/en/latest/core/type_basics.html#sql-standard-and-multiple-vendor-types
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html
http://docs.sqlalchemy.org/en/latest/core/engines.html
http://docs.sqlalchemy.org/en/latest/core/type_basics.html#sql-standard-and-multiple-vendor-types
http://stackoverflow.com/questions/30631325/writing-to-mysql-database-with-pandas-using-sqlalchemy-to-sql
http://stackoverflow.com/questions/5687718/how-can-i-insert-data-into-a-mysql-database
http://stackoverflow.com/questions/32235696/pandas-to-sql-gives-unicode-decode-error
http://stackoverflow.com/questions/34383000/pandas-to-sql-all-columns-as-nvarcharoracle