这篇文章主要介绍如何使用Python实现从SQL型数据库读写dataframe型数据的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
Python的熊猫包对表格化的数据处理能力很强,而SQL数据库的数据就是以表格的形式储存,因此经常将SQL数据库里的数据直接读取为dataframe,分析操作以后再将dataframe存到SQL数据库中,而熊猫中的read_sql和to_sql函数就可以很方便得从SQL数据库中读写数据。
<强> read_sql 强>
参见熊猫。read_sql的文档,read_sql主要有如下几个参数:
- <李>
sql: sql命令字符串
李> <李>反对:连接sql数据库的引擎,一般可以用SQLalchemy或者pymysql之类的包建立
李> <李>index_col:选择某一列作为指数
李> <李>coerce_float:非常有用,将数字形式的字符串直接以浮动型读入
李> <李>parse_dates:将某一列日期型字符串转换为datetime型数据,与pd。to_datetime函数功能类似。可以直接提供需要转换的列名以默认的日期形式转换,也可以用字典的格式提供列名和转换的日期格式,比如{column_name:格式字符串}(格式字符串:“Y %: % m: % H: % m: % S")。
李> <李>列:要选取的列,一般没啥用,因为在sql命令里面一般就指定要选择的列了
李> <李>chunksize:如果提供了一个整数值,那么就会返回一个发电机,每次输出的行数就是提供的值的大小。
李> <李>参数:其他的一些执行参数,没用过不太清楚…
李>以链接常见的mysql数据库为例:
import pandas as pd import pymysql import sqlalchemy 得到sqlalchemy import  create_engine #,1只,用sqlalchemy构建数据库链接引擎 时间=connect_info & # 39; mysql + pymysql://{}: {} @ {}: {}/{} ? charset=use utf8 # 39; .format (DB_USER, DB_PASS, DB_HOST,, DB_PORT,,数据库),# 1 时间=engine create_engine (connect_info) #,sql 命令 时间=sql_cmd “SELECT  *,得到table" 时间=df pd.read_sql (sql=sql_cmd,反对=引擎) #,2只用DBAPI构建数据库链接引擎 con =, pymysql.connect(主机=localhost,用户=用户名,密码=密码,数据库=dbname, charset=& # 39; use utf8 # 39;,, use_unicode=True) df =, pd.read_sql (sql_cmd, con)
<强>解释一下强> # 1:这个是sqlalchemy中链接数据库的URL格式:方言[+司机]://user: password@host/dbname[?键=值. .].dialect代表书库局类型,比如mysql,甲骨文,postgresql.driver代表DBAPI的名字,比如psycopg2, pymysql等。具体说明可以参考这里。此外由于数据里面有中文的时候就需要将字符集设为utf8。
<强> to_sql 强>
参见熊猫。to_sql函数,主要有以下几个参数:
- <李>
名称:输出的表名
李> <李>反对:与read_sql中相同
李> <李>if_exits:三个模式:失败,若表存在,则不输出,取代:若表存在,覆盖原来表里的数据,附加:若表存在,将数据写到原表的后面。默认为失败
李> <李>指数:是否将df的指数单独写到一列中
李> <李>index_label:指定列作为df的指数输出,此时指数为真正的
李> <李>chunksize:同read_sql
李> <李>dtype:指定列的输出到数据库中的数据类型。字典形式储存:{column_name: sql_dtype}。常见的数据类型有<代码> sqlalchemy.types.INTEGER() 代码>,<代码> sqlalchemy.types.NVARCHAR() 代码>,<代码> sqlalchemy.Datetime() 代码>等,具体数据类型可以参考这里
李>还是以写到mysql数据库为例:
df.to_sql (name=& # 39;表# 39;,, ,,反对=反对,, ,,if_exists=& # 39;添加# 39;,, ,,指数=False, ,,dtype={& # 39; col1 # 39;: sqlalchemy.types.INTEGER (), ,,,,& # 39;col2 # 39;: sqlalchemy.types.NVARCHAR(长度=255), ,,,,& # 39;col_time& # 39;: sqlalchemy.DateTime (), ,,,,& # 39;col_bool& # 39;: sqlalchemy.types.Boolean ,,})
<强>注:>强如果不提供dtype, to_sql会自动根据df列的dtype选择默认的数据类型输出,比如字符型会以<代码> sqlalchemy.types.TEXT> 代码类型输出,相比NVARCHAR,文本类型的数据所占的空间更大,所以一般会指定输出为NVARCHAR;而如果df的列的类型为np.int64时,将会导致无法识别并转换成整数型,需要事先转换成int类型(用地图,申请函数可以方便的转换)。