Pandas获取SQL数据库read_sql()函数及参数一文详解+实例代码

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Pandas获取SQL数据库read_sql()函数及参数一文详解+实例代码

前言


Pandas常用作数据分析工具库以及利用其自带的DataFrame数据类型做一些灵活的数据转换、计算、运算等复杂操作,但都是建立在我们获取数据源的数据之后。因此作为读取数据源信息的接口函数必然拥有其强大且方便的能力,在读取不同类源或是不同类数据时都有其对应的read函数可进行先一步处理,这会减少我们相当大的一部分数据处理操作。每一个read()函数,作为一名数据分析师我个人认为都应该掌握且熟悉它对应的参数,相对应的read()函数博主已有两篇文章详细解读了read_json和read_excel:


一、基础语法与功能

pandas.read_sql(
                sql, 
                con, 
                index_col=None, 
                coerce_float=True, 
                params=None, 
                parse_dates=None,     
                columns=None, 
                chunksize=None)

共有8个可选参数:sql,con,index_col,coerce_float,params,parse_date,columns,chunksize。


该函数基础功能为将SQL查询或数据库表读入DataFrame。此函数是read_sql_table和read_sql_query(向后兼容性)两个函数功能结合。它将根据提供的输入参数传入给特定功能。一个SQL查询将传入到read_sql_query查询,而数据库表名称将路由到read_sql_table表。特定功能为SQL引擎驱动进行查询获取数据库内的数据。


二、参数说明和代码演示


sql : string or SQLAlchemy Selectable (select or text object)
SQL query to be executed or a table name.
con : SQLAlchemy connectable (engine/connection) or database string URI
or DBAPI2 connection (fallback mode)
Using SQLAlchemy makes it possible to use any DB supported by that library. If a DBAPI2 object, only sqlite3 is supported.
index_col : string or list of strings, optional, default: None
Column(s) to set as index(MultiIndex).
coerce_float : boolean, default True
Attempts to convert values of non-string, non-numeric objects (like decimal.Decimal) to floating point, useful for SQL result sets.
params : list, tuple or dict, optional, default: None
List of parameters to pass to execute method. The syntax used to pass parameters is database driver dependent. Check your database driver documentation for which of the five syntax styles, described in PEP 249’s paramstyle, is supported. Eg. for psycopg2, uses %(name)s so use params={‘name’ : ‘value’}
parse_dates : list or dict, default: None
List of column names to parse as dates.
Dict of {column_name: format string} where format string is strftime compatible in case of parsing string times, or is one of (D, s, ns, ms, us) in case of parsing integer timestamps.
Dict of {column_name: arg dict}, where the arg dict corresponds to the keyword arguments of pandas.to_datetime() Especially useful with databases without native Datetime support, such as SQLite.
columns : list, default: None
List of column names to select from SQL table (only used when reading a table).
chunksize : int, default None
If specified, return an iterator where chunksize is the number of rows to include in each chunk.


上述为官网文档参数说明:Pandas.read_sql()


首先我们将逐个了解每个参数的功能和作用,在了解参数意义后再进行实例使用。


要进行参数测试要先连接数据库,这里用本地环境进行测试:


首先打开mysql,要以管理员方式进入命令提示符:

331948ebf68c4193a4287201d1df79be.png


进入Jupyter,需要再引入pymysql库:


import pymysql


该库想要详细了解可以去博主的另一篇博文: ython-pymysql库使用一文详解+实例代码

此库为连接mysql的接口函数:

# 打开数据库连接
conn = pymysql.connect(host='localhost',# 连接的数据库服务器主机名
                       port=3306,# 数据库端口号
                       user='root',# 数据库登录用户名
                       passwd='xxxx',#数据库密码
                       db='mysql',  # 数据库名称
                       charset = 'utf8' 连接编码
                       )

还需引入SQLalchemy库的创建引擎函数:


from sqlalchemy import create_engine


创建引擎:

engine=create_engine('mysql+pymysql://root:xxxx@localhost/mysql?charset=utf8')

1.sql


接受类型:{str or SQLAlchemy Selectable (select or text object)}


这个SQLAlchemy Selectable就是SQL查询语法,该参数可以为执行的SQL查询或获取指定表名的数据。


展示:需求要读取metric_value这张sql数据表:


340d8a3565104ea3a2d11bbfe422b7e5.png


将一段sql查询语句作为参数传入,可获得sql查询的表转化的dataframe:

sql_cmd ='SELECT * FROM metric_value'
df_sql=pd.read_sql(sql_cmd,engine)
df_sql

可以见到是和原sql表一样的内容:

6b595559c71c41408689f4d265c502a9.png

也可以将sql内的表名作为参数传入,可以获得该表的全部内容:

sql_table ='metric_value'
df_sql=pd.read_sql(sql_table,engine)
df_sql

47cbef64864543a181a5c503eb60d85e.png

2.con


接受类型:{SQLAlchemy connectable, str, or sqlite3 connection}


使用SQLAlchemy可以使用该库支持的任何DB。如果是DBAPI2对象,则仅支持sqlite3。用户负责SQLAlchemy connectable的引擎处理和连接关闭;str连接将自动关闭。


con为python连接sql的sqlalchemy.engine,该参数也为必须输入的参数,可以使用SQLAlchemy数据库支持的连接引擎。上文已经创建这里不再进行操作


3.index_col


接受类型:{str or list of str, optional, default: None}

可指定参数为要设置为索引的列(多索引)。

sql_table ='metric_value'
df_sql=pd.read_sql(sql_table,engine,index_col='id')
df_sql

90621a614c584a26b2ec9500d09e1739.png

也可以设定多个索引,当然转化为dataframe之后用set_index也可以达到一样的效果,大家要是忘了如何操作dataframe的索引的话可以去博主的:一文速学-Pandas索引设置操作各类方法详解+代码展示 在看一遍就好了。


sql_table ='metric_value'
df_sql=pd.read_sql(sql_table,engine,index_col=['id','time'])
df_sql

aff6375e804a44f4b0757979a5ed10f9.png


4.coerce_float


接受类型:{bool, default True}

尽力函数:将非字符串、非数字对象(如decimal.Decimal)的值转换为浮点,这对SQL结果集很有用。相当于将一些数据类型转换为浮点数据类型,True开着就行了。


5.params


接受类型:{list, tuple or dict, optional, default: None}列表,元组,指定,默认为None。


可传入参数为要传递给execute方法的参数列表。用于传递参数的语法依赖于数据库驱动程序。查看数据库驱动程序文档,了解支持PEP 249的paramstyle中描述的五种语法样式中的哪一种。例如,对于psycopg2,指定需要使用%(name)s,所以使用params={'name':'value'}。


也就是可以以一个sql对于一个输出以这样的形式输出。


6.parse_dates


接受类型:{list or dict, default: None}


要分析为日期的列名列表。

{column_name:format string}Dict,其中format string在解析字符串时间时与strftime兼容,或者在解析整数时间戳时是(D、s、ns、ms、us)之一。

{column_name:   arg Dict}Dict,其中arg Dict对应于pandas的关键字参数。to_datetime()对于不支持本机datetime的数据库(如SQLite)特别有用。

原转化的DataFrame各个字段数据类型为:


8ab4f6a3473540c7a3fc0daa910d317e.png

现在我们将time也转化为datetime形式:

sql_table ='metric_value'
df_sql=pd.read_sql(sql_table,engine,parse_dates=['time'])
df_sql.dtypes

可见time转化为了datetime类型:


ce873c0c22144df2810c337ff82ce9f5.png

这是使用了to_datetime()函数来达成该功能 ,导致直接使用unix从1970-0-0 00:00开始计算,不了解原理可以去看这篇:Pandas中to_datetime()转换时间序列函数一文详解

我们在后面加个format就能转换为我们想要的类型:


sql_table ='metric_value'
df_sql=pd.read_sql(sql_table,engine,parse_dates={'time' :{"format": "%Y%m%d"}})
df_sql

b523a32adbc14ef187e105d18b662af5.png


7.columns


接受类型:{list, default: None}

从SQL表中选择的列名列表(仅在读取表时使用)。

sql_table ='metric_value'
df_sql=pd.read_sql(sql_table,engine,columns=['time','code','value'])
df_sql

f55d080b6522408c8ac1de8ac1604858.png


8.chunksize


接受类型:{int, default None}

如果指定,则返回一个迭代器,其中chunksize是每个块中要包含的行数。

sql_table ='metric_value'
df_sql=pd.read_sql(sql_table,engine,columns=['time','code','value'],chunksize=int)
df_sql

得到一个SQLtable迭代类型:


三、返回参数


DataFrame or Iterator[DataFrame]

返回DataFrame或是SQL的迭代器。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
3月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
61 10
|
3月前
|
SQL Oracle 关系型数据库
SQL优化-使用联合索引和函数索引
在一次例行巡检中,发现一条使用 `to_char` 函数将日期转换为字符串的 SQL 语句 CPU 利用率很高。为了优化该语句,首先分析了 where 条件中各列的选择性,并创建了不同类型的索引,包括普通索引、函数索引和虚拟列索引。通过对比不同索引的执行计划,最终确定了使用复合索引(包含函数表达式)能够显著降低查询成本,提高执行效率。
|
3月前
|
SQL 数据管理 数据库
SQL语句实例教程:掌握数据查询、更新与管理的关键技巧
SQL(Structured Query Language,结构化查询语言)是数据库管理和操作的核心工具
|
4月前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
681 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
3月前
|
SQL 数据库 数据库管理
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具
|
3月前
|
SQL 数据库 索引
SQL中COUNT函数结合条件使用的技巧与方法
在SQL查询中,COUNT函数是一个非常常用的聚合函数,用于计算表中满足特定条件的记录数
|
3月前
|
SQL 关系型数据库 MySQL
SQL日期函数
SQL日期函数
|
4月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
5月前
|
SQL 数据处理 数据库